La función más importante de una computadora es procesar datos. Un lenguaje informático útil debe tener buenas capacidades de E/S para que los datos no procesados fluyan hacia el programa y los datos procesados salgan.
En comparación con otros lenguajes, las funciones IO de Java son complejas. En otros lenguajes, muchas funciones de IO (como la lectura de archivos) están encapsuladas y se pueden implementar con una o dos líneas de programa. En Java, los programadores a menudo necesitan múltiples niveles de decoración para lograr la lectura de archivos.
El beneficio de la relativa complejidad es la flexibilidad de IO. En Java, los programadores pueden controlar todo el proceso de IO para diseñar el mejor método de IO. Veremos más a continuación.
ejemplo de E/S
A continuación se muestra el archivo file.txt que utilicé para la demostración.
¡Hola mundo! ¡Hola nerd!
Primero estudiemos un ejemplo de lectura de archivos:
importar java.io.*;prueba de clase pública{ public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader("file.txt" line = br.readLine()); while (línea! = nulo) { System.out.println(línea); línea = br.readLine() } br.close() } catch(IOException); e) { System.out.println("Problema IO");
Este programa contiene un controlador de excepciones try...catch...finally. Consulte el Tutorial avanzado de Java sobre manejo de excepciones.
Decoradores y combinaciones de funciones.
La clave para programar IO es crear un objeto BufferedReader:
BufferedReader br = nuevo BufferedReader(nuevo FileReader("archivo.txt"));
Durante el proceso de creación, primero creamos un objeto FileReader. La función de este objeto es leer el flujo de bytes del archivo "file.txt" y convertirlo en un flujo de texto. En Java, la codificación de texto estándar es Unicode. BufferedReader () recibe el objeto FileReader, expande las funciones de FileReader y crea un nuevo objeto BufferedReader. Además de las funciones de lectura y conversión de archivos mencionadas anteriormente, este objeto también proporciona funciones de lectura en caché (búfer). Finalmente, podemos leer el archivo línea por línea llamando al método readLine() en el objeto br.
(La lectura de caché consiste en abrir un área en la memoria como caché, que almacena el flujo de texto leído por FileReader. Cuando se lee el contenido del caché (como el comando readLine (),), el caché cargará el flujo de texto posterior).
BufferedReader() es un decorador que recibe un objeto primitivo y devuelve un objeto decorado con funciones más complejas. La ventaja de los decoradores es que pueden utilizarse para decorar diferentes objetos. Lo que estamos modificando aquí es el flujo de texto leído del archivo. BufferedReader() puede modificar otros flujos de texto, como la entrada estándar, los flujos de transmisión de red, etc., para lograr la lectura en caché.
El siguiente diagrama muestra cómo funciona br, con los datos fluyendo de abajo hacia arriba:
El proceso de decoración anterior es muy similar a la idea del flujo de texto en Linux. En Linux, utilizamos un enfoque similar a una función para procesar y pasar flujos de texto. En Java utilizamos decoradores. Pero sus propósitos son similares, que es lograr la modularización y la libre combinación de funciones.
más combinaciones
De hecho, Java proporciona un rico conjunto de decoradores. FileReader combina los dos pasos de lectura y conversión y adopta configuraciones predeterminadas de uso común, como Unicode para codificación. Podemos usar la combinación de FileInputStream + InputStreamReader para reemplazar FileReader, separando así los dos pasos de lectura de bytes y conversión, y teniendo un mejor control sobre los dos procesos.
(Por supuesto, FileReader es más conveniente de usar. InputStreamReader convierte FileInputStream en un lector para procesar texto Unicode)
Las flechas indican la dirección del flujo de datos.
La lectura y escritura de flujos provienen de cuatro clases base: InputStream, OutputStream, Reader y Writer. InputStream y Reader manejan operaciones de lectura, y OutputStream y Writer manejan operaciones de escritura. Ambos están ubicados en el paquete java.io. La relación de herencia es la siguiente:
java.io
Además, IOException tiene las siguientes clases derivadas:
IOExcepción
Reader y Writer y sus clases derivadas manejan texto Unicode. Como vemos Buffered Reader, InputStreamReader o FileReader.
InputStream y OutputStream y sus clases derivadas manejan flujos de bytes. Los datos en la computadora se pueden considerar en forma de bytes, por lo que InputStream y OutputStream se pueden usar para procesar una gama más amplia de datos. Por ejemplo, podemos usar la siguiente combinación para leer los datos (como números enteros) contenidos en el archivo comprimido:
Las flechas indican la dirección del flujo de datos.
Leemos el flujo de bytes del archivo comprimido, luego lo descomprimimos y finalmente leemos los datos.
escribir
Las operaciones de escritura son similares a las operaciones de lectura. Podemos implementar funciones de escritura complejas mediante el uso de decoraciones. A continuación se muestra un ejemplo sencillo de escritura de texto:
import java.io.*;public class Test{ public static void main(String[] args) { try { String content = "Gracias por tu pescado."; / crea el archivo si no existe if (!file.exists()) { file.createNewFile() } FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = nuevo BufferedWriter(fw); bw.write(content); bw.close(); catch(IOException e) { System.out.println("Problema IO");
El objeto de archivo se crea arriba para procesar rutas de archivos.
Resumir
Esta es sólo una introducción básica a Java IO. La IO de Java es relativamente compleja. Los programadores de Java necesitan dedicar algún tiempo a familiarizarse con las clases de java.io y su funcionalidad.