Las funciones de entrada y salida del lenguaje Java son muy potentes y flexibles. El único inconveniente es que los códigos de entrada y salida parecen ser muy concisos, porque a menudo necesita envolver muchos objetos diferentes. En la biblioteca de clases Java, el contenido de la parte IO es muy grande porque implica una amplia gama de campos: entrada y salida estándar, operación de archivos, flujos de datos en la red, secuencias de cadena, flujos de objetos, flujos de archivos zip ... El propósito de este artículo es introducir una explicación detallada de ejemplos de flujo de entrada y salida en Java.
La jerarquía de flujos
definición:
Java leerá el objeto de datos en un flujo de entrada, y el objeto al que se puede escribir se llama flujo de salida. El diagrama de la estructura es el siguiente:
1. Entrada y salida:
La entrada/salida se refiere a la entrada o salida de datos a un determinado dispositivo o entorno. Cualquier idioma tiene la función de entrada y salida. En un programa Java, la entrada y la salida se completan a través de las transmisiones. Está conectado a dispositivos físicos a través de un sistema de entrada y salida de Java. Aunque los dispositivos físicos reales conectados a las secuencias de entrada y salida son diferentes, pueden funcionar de la misma manera. Por ejemplo, para la entrada y salida del disco duro, la entrada y salida del host de red, por lo que habrá varios problemas y soluciones de entrada y salida para diferentes dispositivos o entornos.
2. Stream:
Una secuencia se refiere a una secuencia de datos que se mueve entre la entrada y la salida de una computadora. Los datos en la secuencia de flujo pueden ser datos binarios sin procesar que no se han procesado o datos específicos que cumplan con los requisitos de un determinado formato después de un cierto proceso de codificación. Es habitual llamar a la pieza relacionada con el código interno y la parte independiente del código externo.
Desde el método de transmisión de datos, la secuencia se puede dividir en flujo de entrada y flujo de salida; Desde el contenido de la transmisión, la transmisión se puede dividir en la transmisión de bytes y la secuencia de caracteres.
(1) transmisión de entrada y salida
La función de la secuencia de entrada es leer datos desde el interior del programa hacia el exterior.
La función de la transmisión de salida es escribir datos fuera del programa a adentro.
(2) transmisión de bytes y transmisión de personajes
Un flujo de bytes puede leer y escribir datos en unidades de bytes, que pueden leer y escribir datos de un byte tras otro, o leer y escribir bloques de bytes de cualquier longitud a la vez (es decir, matrices de bytes).
Las transmisiones de caracteres se usan en personajes al leer y escribir datos en transmisiones, un carácter a la vez o un bloque de caracteres a la vez.
Para facilitar el procesamiento de flujo, las transmisiones en el idioma Java están encapsuladas en el paquete Java.io, por lo que para usar transmisiones, debe importar el paquete Java.io.
El flujo de E/S de Java se basa en cuatro clases abstractas, a saber, InputStream, OutputStream, Lector y escritor. La clase InputStream y su subclase se pueden usar para implementar el procesamiento de entrada de los datos de la secuencia de bytes; La clase OutputStream y su subclase se pueden usar para implementar el procesamiento de salida de los datos de la secuencia de bytes; La clase del lector y su subclase se pueden usar para implementar el procesamiento de entrada de los datos de la secuencia de caracteres; La clase de escritor y su subclase se pueden utilizar para implementar el procesamiento de salida de los datos de la secuencia de caracteres.
1. Clase de archivo
La lectura y la escritura de archivos en Java se pueden implementar a través de transmisiones de entrada y salida, pero Java proporciona una clase de archivo especial para implementarlo para directorios de archivos, propiedades e información de administración.
(1) El constructor de la clase de archivo
Los constructores para crear un objeto de clase de archivo son:
Archivo (String PathName); // Crear basado en el nombre de la ruta.
Archivo (archivo parent, string child); // Crear debajo del objeto de archivo dado.
Archivo (string parent, string child); // Crear basado en la ruta especificada.
Archivo (url url); // Crear basado en un enlace de URL.
(2) Métodos comunes de clase de archivo
Boolean Canread (): determina si la ruta correspondiente al objeto de archivo es legible.
Boolean CanWrite (): determina si la ruta correspondiente al objeto de archivo es escritura.
boolean existe (): determina si existe la ruta correspondiente al objeto de archivo.
String getAbSolutePath (): Obtiene la ruta absoluta de la ruta correspondiente del objeto de archivo.
String getParent (): obtiene el directorio de la ruta correspondiente del objeto de archivo.
String getPath (): obtiene la ruta correspondiente al objeto de archivo.
boolean isabsolute (): determina si la ruta correspondiente al objeto de archivo es una ruta absoluta.
String getName (): obtiene el nombre de archivo de la ruta correspondiente del objeto de archivo.
boolean isDirectory (): determina si la ruta correspondiente al objeto de archivo es un directorio.
boolean isFile (): determina si la ruta correspondiente al objeto de archivo es un archivo.
boolean ishidden (): determina si el archivo correspondiente al objeto de archivo es un atributo oculto.
longitud larga (): Obtenga la longitud del archivo correspondiente al objeto de archivo.
Long LastModified (): Obtenga el último tiempo de modificación del archivo correspondiente al objeto Archivo.
Boolean Renameto (archivo Dest): cambie el nombre del archivo del archivo correspondiente al objeto Archivo.
boolean setReadonly (): Establezca el archivo correspondiente del objeto Archivo en solo lectura.
(3) Crear un archivo
Cree un nuevo archivo creando una transmisión de salida de archivo. Este método no puede crear un directorio, y si el archivo que desea crear ya existe, se creará un nuevo archivo para sobrescribir el archivo original.
FileoUtrputStream file = new FileOutputStream ("FileName"); (4) Obtener una lista de archivos
Obtenga una lista de archivos de una determinada carpeta a través del método list () o listFiles () de la clase de archivo. Hay varios formularios:
Cadena [] list ();
Archivo [] listFiles ();
Archivo [] listFiles (filtro de nombre de nombre de archivo);
Archivo [] listFiles (filtro de FileFilter);
Entre ellos, FileFilter y FileNameFilter son interfaces, y el filtro es el filtro correspondiente. Declare una determinada clase e implemente la interfaz de filtro, de modo que todos los archivos coincidentes se puedan enumerar a través de condiciones de filtrado.
2. Clase InputStream y Clase OutputStream
La clase Byte Stream es una serie de clases derivadas de las clases abstractas InputStream y OutputStream. Este tipo de transmisión se basa en bytes. Las clases InputStream y OutputStream se pueden usar para procesar datos de archivos binarios, pero también para procesar archivos de texto.
1. Métodos comunes de la clase InputStream
La clase InputStream es la clase principal de todas las secuencias de entrada. Todos los métodos de esta clase lanzarán una IOException cuando ocurra un error. Los métodos principales son:
(1) Public Abstract int read () esas IoException
El método devuelve un entero entre 0 y 255 o -1, y -1 significa que se ha encontrado el final de la corriente, y otros bytes correspondientes se leen.
(2) Public int Read (Byte [] b) Esas IoException
El método lee bytes en la matriz de bytes dada por el parámetro, y el valor de retorno es el número de bytes que realmente se leen en o -1 (se encuentra el final de la secuencia).
(3) Public int Read (Byte [] b, int i, int b) Esas ioexception
Los dos últimos parámetros del método dan la posición inicial de Read y el número máximo de bytes leídos respectivamente.
(4) Public int disponible ()
Devuelve el número de bytes que no se han leído en el objeto de transmisión actual. Es decir, obtenga la longitud de los datos en la secuencia.
(5) Público salto largo (N)
Skip n bytes en el objeto de transmisión actual, y el número real de bytes se saltea se devuelve como un valor de retorno.
(6) Public Boolean Marksupported ()
Determine si el flujo admite marcas, y las marcas pueden volver fácilmente a la posición de lectura original.
(7) Public Void Close ()
Cierre el objeto de transmisión actual y libere los recursos ocupados por el objeto de transmisión.
(8) Marca pública nula (int i)
Establezca un indicador para la posición actual en la transmisión para que pueda continuar leyendo desde esa posición más adelante.
(9) RESET PUBLICO VOCH ()
Devuelva la posición de la lectura de la transmisión a la posición de la marca de ajuste.
2. Métodos comunes de la clase de salida de salida
La clase OutputStream es la clase principal de todas las secuencias de salida. Todos los métodos de esta clase devuelven y arrojan una IOException en un caso de error. Los métodos principales son:
(1) Public void Write (int b) lanza ioexception
Escriba un byte de datos al final de la transmisión.
(2) Public void Write (byte [] b) lanza ioexception
Escriba los datos en la matriz B al objeto de transmisión actual a su vez.
(3) Public Void Wire (Byte [] b, int i, int n)
Escriba datos de longitudes posteriores en la matriz en el objeto de transmisión en secuencia desde el principio (incluido).
(4) Public Void Close ()
Cierre el objeto de transmisión actual y libere los recursos ocupados por el objeto de transmisión.
(5) Public Void Flush ()
Force Salida Los datos almacenados en el objeto de flujo actual. Use este método para lograr una salida inmediata.
La mayoría de los métodos de las dos clases anteriores se anulan mediante subclases de InputStream y OutputStream, excepto los métodos Mark () y RESET ().
3. Clase FileInputStream
La clase FileInputStream es una subclase de InputStream, que puede usarse para procesar flujos de datos que usan archivos como fuentes de entrada de datos para implementar operaciones de lectura de archivos.
Sus métodos de construcción son:
(1) FileInputStream (archivo f)
Cree una secuencia de entrada de archivo con el objeto de archivo F con el nombre especificado como la fuente de datos.
Si F existe, debería ser una ruta de archivo. Si se trata de un directorio, se lanzará una IOException, pero si este directorio no existe, se lanzará: FileNotFoundException se lanzará.
(2) FileInputStream (nombre de cadena)
Cree una transmisión de entrada de archivo con un archivo llamado Nombre como fuente de datos.
(3) FileInputStream (FileDeScriptor F)
Cree una transmisión de entrada de archivo para el final de entrada basado en el objeto Descriptor del archivo f.
Su método principal es anular los métodos de la clase principal (InputStream Class): Read (), Read (Byte [] B), Read (Byte [] B, Int I, int Longitud), Skip (Long N), disponible (), Close ().
4. Clase FileOutputStream
La clase FileOutputStream es una subclase de OutputStream, que se utiliza para procesar los flujos de datos de salida por archivos como datos e implementar operaciones de escritura a los archivos. Sus métodos de construcción son:
FileOutputStream (archivo f);
FileOutputStream (File F, Boolean B);
FileOutputStream (String f);
Sus métodos principales incluyen métodos que cubren la clase principal: escribir (int b), escribir (byte [] b), escribir (byte [] b, int off, int len), cerrar () y flush ().
5. Clases de DataInputStream y DatautputStream
Los objetos creados por DateInputStream y las clases de DatautputStream se denominan flujos de entrada de datos y flujos de salida de datos, respectivamente. Implementan la interfaz de DataAnput y la interfaz DataOutput respectivamente. La clase dateInputStream y el objeto DataOutputStream permiten la lectura de varios tipos de datos de Java.
Estas dos transmisiones pertenecen a transmisiones de filtrado, y otras secuencias como InputStream o OutputStream a menudo se usan como su entrada o salida. Por ejemplo:
FileInputStream fis = new FileInputStream ("d: //a.txt");
DataInputStream dis = new DataInputStream (FIS);
FileOutputStream fos = new FileOutputStream ("d: //a.txt");
DataOutputStream dos = new DataOutputStream (FOS);
La entrada y la salida de dateInputStream y DataOutputStream son casi correspondientes. Los métodos de lectura y escritura de cada tipo de datos básicos se pueden identificar a partir de su nombre de sufijo. Por ejemplo:
readInt (), writeint () // lea y escribe un valor int
ReadBoolean (), WriteBoolean () // Leer y escribir un valor booleano
readchar (), writeChar () // Leer y escribir un personaje
readDouble (), WritedOuble () // Leer y escribir un valor de punto flotante de doble precisión
readfloat (), writefloat () // Leer y escribir un valor de punto flotante de precisión única
WriteChars () // Escribe una cadena, pero no hay forma de leer la cadena directamente
3. Clase de lector y clase de escritor
Los personajes en Java usan una codificación de Unicode, cada personaje tiene dos bytes, es decir, 16 bits. Las secuencias de caracteres se basan en caracteres representados por códigos Unicode de 16 bits y leen y escriben datos de texto, lo que puede realizar la conversión entre formatos internos en programas Java y formatos externos como archivos de texto, salidas de pantalla, entradas de teclado, etc. Este método es especialmente adecuado para la operación de caracteres chinos. Si los caracteres chinos operan en bytes, es posible generar código confuso.
El lector y el escritor son clases de padres abstractos de todas las transmisiones de caracteres en el paquete Java.io, definiendo métodos clave para implementar otras clases de transmisión. Los dos más importantes son Read () y Write (), que leen y escriben datos de caracteres respectivamente. Los métodos de las clases de lectores y escritores y sus subclases son muy similares a los métodos de uso de clases de InputStream, clases de salida y sus subclases. Pero los parámetros en él se reemplazan con caracteres o matrices de caracteres.
1. Métodos comunes de clase de lector y clase de escritor
La clase del lector es una clase abstracta. Todos los métodos de esta clase lanzarán una excepción de IOException en condiciones de error. Los métodos comunes son los siguientes:
(1) abstracto void cerrador (): cierre la fuente de entrada.
(2) Marca vacía (int numchars): coloque una marca en el punto de corriente de la fuente de entrada.
(3) Boolean MarkSupported (): si esta secuencia admite el método Mark/RESET, se devolverá verdadero.
(4) int read (): lea un solo personaje.
(5) int read (char [] buf): lea los caracteres en la matriz de caracteres.
(6) Abstract Int Read (char [] buf, int offset, int numchars): lea los caracteres en una parte de la matriz.
(7) Boolean Ready (): Devuelve verdadero si la siguiente solicitud de entrada no tiene que esperar, de lo contrario devolver falso.
(8) NUEVO RESET (): Restablezca el puntero de entrada al conjunto marcado antes.
(9) Skip largo (Numchars Long): omita la entrada del personaje y devuelve el número real de caracteres omitidos.
La clase de escritor también es una clase abstracta, y los métodos de uso común son los siguientes:
(1) abstracto void cerrador (): cierre la secuencia de salida.
(2) Flush void abstracto (): determine el estado de salida para borrar cualquier caché.
(3) Escribir void (int ch): escriba un solo carácter.
(4) Void Write (char [] buf): escriba en una matriz de personajes.
(5) Resumen Void Write (char [] buf, int offset, int numchars): escriba parte de la matriz de caracteres.
(6) Escribir void (cadena Str): escriba una cadena.
(7) Void Write (String Str, int Offset, int numchars): escribir parte de la cadena.
2. Clase de FileReader
La clase FileReader hereda de la clase InputStreamReader, y la clase InputStreamReader hereda de la clase del lector. Por lo tanto, los métodos proporcionados por la clase de lector y la clase InputStreamReader se pueden usar para los objetos creados por la clase FileReader. Los métodos de constructor de FileReader son:
FileReader (archivo de archivo);
FileReader (FileDeScriptor E);
FileReader (String FileName);
3. Clase de presentación de archivos
La clase FileWriter hereda de la clase OutputStreamWriter, y la clase OutputStreamWriter hereda de la clase de escritor. Por lo tanto, los métodos proporcionados por la clase del escritor y la clase OutputStreamWriter pueden ser utilizados por los objetos creados por la clase FileWriter. Los métodos de constructor de FileWriter son:
FileWrite (archivo filepath);
FileWrite (archivo F, boolean append);
FileWrite (FileDeScriptor E);
FileWrite (String FileName);
FileWrite (String FileName, Boolean Append);
4. Clase BufferedReader
La clase BufferedReader hereda de la clase del lector, que se usa para leer datos en el búfer. La clase BufferedReader pertenece a transmisiones de filtrado, y otras secuencias como FileReader a menudo se usan como su entrada o salida. Sus métodos de construcción son:
BufferedReader (lector en);
BufferedReader (lector en, int bufsize);
Por ejemplo:
FileReader fr = new FileReader ("d: /1.txt");
BufferedReader buf = new BufferedReader (FR);
BufferedReader proporciona el método ReaderLine () para leer cada línea de texto.
5. Clase de escritor buffered
La clase BufferedWriter hereda de la clase de escritor, y la clase BufferedWriter se usa para escribir datos en el búfer. El uso de la clase BufferedWriter es similar a usar la clase BufferedReader. La diferencia es que los datos en el búfer deben eliminarse mediante el método FLUSH () al final, es decir, escribir todos los datos en el búfer en el archivo. Sus métodos de construcción son:
BufferedWriter (escritor fuera);
BufferedWriter (Writer Out, Int Bufsize);
4. Clase de archivo randomaccesss
El acceso al archivo aleatorio en Java requiere el uso de la clase RandomAccessFile (esta clase permite el acceso desde cualquier ubicación, no solo lea, sino que también escribe), que hereda directamente de la clase de objetos e implementa las interfaces DataAnput y DataOutput.
Dado que la clase RandomAccessFile implementa todos los métodos definidos en las interfaces de DataAnput y DataOutput, puede leer datos de tipo básico del archivo y escribir datos de tipo básico en el archivo. Además de los métodos definidos en las interfaces DataAnput y DataOutput, la clase RandomAccessFile también define algunos otros métodos para admitir el acceso aleatorio.
La transmisión creada por la clase RandomAccessFile es diferente de las transmisiones de entrada y salida anteriores. La clase RandomAccessFile no es una subclase de la clase InputStream en la clase de flujo de entrada, ni una subclase de la clase OutputStream en la clase de flujo de salida. Sin embargo, la dirección de la transmisión creada por la clase RandomAccessFile se puede usar como fuente y destino. En otras palabras, al leer y escribir un archivo, puede crear una transmisión RandomAccessFile que apunte al archivo, para que pueda leer los datos del archivo de la transmisión y escribir datos en el archivo a través de la transmisión.
Dos métodos de constructor de clase RandomAccessFile:
(1) RandomAccessFile (nombre de cadena, modo de cadena)
El nombre del parámetro se usa para determinar un nombre de archivo, dando a la fuente (también el destino de flujo) de la transmisión creada, y el modo de parámetro toma R (solo lectura) o RW (lectura de lectura), que determina los derechos de acceso de la transmisión creada al archivo.
(2) RandomAccessFile (archivo de archivo, modo de cadena)
El archivo de parámetro es un objeto de archivo, que proporciona la fuente (también el destino de la secuencia). El modo de parámetro toma R (solo lectura) o RW (lectura de lectura), y determina los derechos de acceso de la transmisión creada al archivo. Al crear un objeto, la FileNotFoundException debe ser atrapada; Cuando la transmisión realiza operaciones de lectura y escritura, la IOException debe ser atrapada.
El método de lectura y redacción de información del Object RandomAccessFile es el mismo que el método de entrada y salida del objeto de datos. Puede acceder a todos los métodos Read () y Write () en las clases DataStPutStream y DataOutputStream.
Cómo mover el archivo Leer y escribir consejos:
(1) Long getFilePointer (): Devuelve la ubicación actual del puntero del archivo.
(2) Seek Void (Long Pos): coloque el puntero del archivo en la posición absoluta especificada. El valor de posición se calcula como el POS de compensación de bytes desde el inicio del archivo. POS es 0, que representa el comienzo del archivo.
(3) Longitud larga (): Devuelve la longitud del archivo. El valor de posición es longitud (), que representa el final del archivo.