Las funciones de entrada y salida del lenguaje Java son muy potentes y flexibles, y las operaciones de datos de entrada y salida se llevan a cabo de una manera de "flujo". J2SDK proporciona una variedad de clases de "transmisión" para obtener diferentes tipos de datos, definidos en el paquete Java.io. Los datos son entrada o salida en el programa a través de métodos estándar.
Las transmisiones en Java se pueden clasificar desde diferentes perspectivas:
Según la dirección de la transmisión: se divide en la secuencia de entrada y la corriente de salida.
Según las diferentes unidades de datos: se divide en la corriente de bytes (8 bits) y la corriente de caracteres (16 bits).
Según diferentes funciones: dividido en el flujo de nodos y el flujo de procesamiento.
Flujo de nodo: es un flujo (como archivo, memoria) que puede leer y escribir datos desde una fuente de datos específica (nodo). Es como un solo tubo conectado al grifo y comienza a liberar agua.
Flujo de procesamiento: está "conectado" en una secuencia existente (flujo de nodo o flujo de procesamiento), proporcionando al programa funciones de lectura y escritura más potentes a través de datos de procesamiento. Al igual que en la base de tener una tubería (flujo de nodo) conectado, algunas tuberías más gruesas y especiales (flujo de procesamiento) se realizan en tratamiento adicional del agua de salida.
Todos los tipos de transmisión proporcionados por J2SDK que se encuentran en el paquete Java.io heredan los siguientes cuatro tipos de flujo de resumen.
Las cuatro transmisiones básicas de InputStream, OutputStream, Reader y Writer tienen subclases más específicas, que se dividen en transmisiones de archivos, flujos de búfer, flujos de datos, flujos de conversión, flujos de impresión, flujos de objetos, etc., todos los cuales tienen funciones específicas o se usan para operar datos específicos. Entre ellos, los colores oscuros representan el flujo de nodo, y los colores claros representan el flujo de procesamiento.
Aquí resumimos el uso específico del flujo a través del flujo de nodo y el flujo de procesamiento.
Clasificación de flujos de nodo:
Node Streams Process File (archivo), Array (Array in Memory), String (String) y Pipe (Pipe) respectivamente.
Clasificación de flujos de procesamiento:
Las transmisiones de procesamiento de uso común incluyen: flujo de búfer, flujo de conversión, flujo de datos, flujo de objetos y flujo de impresión.
Stream buffered: debe ser afilado en la transmisión de bytes correspondiente, y proporciona una función de almacenamiento en búfer para datos de lectura y escritura, lo que mejora la eficiencia de lectura y escritura, y también agrega algunos métodos más convenientes.
La función de un flujo de búfer es como un cubo. El flujo de byte original es una tubería de agua. La tubería de agua está conectada directamente al destino. Después de agregar el flujo de búfer, se conecta un cubo debajo de la tubería de agua y luego se vierte en el destino después de que el cubo se llene de agua. Juega un papel amortiguado. De esta manera, puede leer más datos a la vez, evitando la lectura frecuente y la escritura en el disco duro. Dado que tiene una función de almacenamiento en búfer, debe usar el método FLUSH al escribir datos.
import java.io.*; public class testBufferStream {public static void main (string [] args) {try {bufferedwriter bw = new BufferedWriter (new FileWriter ("f: //java//io/dat.txt")); // transmisión buffed en la corriente de byte en el archivo escrito bufferederer BR = new bufferederer (new FileReader ("f: //java//io/dat.txt")); // transmisión búfered en la secuencia de byte en la cadena de archivo de lectura s = null; for (int i = 1; i <= 100; i ++) {s = string.valueOf (math.random ()); // asignar s a bw.write (s); // Escribir s en el archivo dat.txt bw.newline (); // Escribe un personaje de Break Line. Una mejor manera de usar transmisiones buffered es escribir o leer una fila de datos. } bw.flush (); // Hacer que todos los datos en la memoria se escriban de inmediato y ya no se almacenen en búfer. while ((s = br.readline ())! = null) {// lee el contenido del archivo por línea system.out.println (s); } bw.close (); // Cierre el flujo de procesamiento y cierre el flujo de nodo dentro. br.close (); } catch (ioException e) {E.PrintStackTrace (); }}} Convertir flujo: use la conversión con datos de byte a datos de caracteres. El InputStreamReader requiere un socket InputStream, y el outputStreamWriter requiere un socket OutputStream.
Flujo de datos: DataintPutStream y DataOutputStream proporcionan escribir o leer el tipo de datos básicos en un archivo. Esta transmisión es de gran uso. Si no hay tal transmisión, hay un largo que solo ocupa 8 bytes. Si quiero escribir en el archivo, necesito convertirlo en una cadena y luego convertirlo en una matriz de caracteres, el espacio ocupará mucho. Sin embargo, con esta transmisión, es muy conveniente. Simplemente escriba estos 8 bytes en el archivo, que no solo guarda el espacio de memoria, sino que también hace que el programa sea más conveniente y simple. Sin embargo, debe prestar atención al leer. Según el tipo de datos que lee, el puntero se moverá hacia abajo, por lo que el orden que lea debe ser consistente con el orden de escritura para lograr sus necesidades correctas. De lo contrario, es equivalente a dividir los datos.
import java.io.*; Public Class testDataStream {public static void main (string [] args) {byteArRayOutputStream baos = new ByTearRauteutPutStream (); // Crear un flujo de nodo. DatautputStream dos = new DataOutputStream (BAOS); // Conecte un flujo de datos "tubería" en la secuencia de nodo try {dos.writeDouble (math.random ()); // Tipo doble, 8 bytes dos.Writeboolean (verdadero); // tipo booleano, ocupa un bytebytearrayinputStream Bais = new bytearrayInputStream (baos.tobytearray ()); System.out.println (Bais.available ()); // Número total de bytes disponibles en la transmisión de salida-9 DataInputStream Dis = New DataInputStream (BAIS); // también conecta la secuencia de datos "tubería" fuera de la transmisión de salida System.out.println (dis.readdouble ()); // Lea en torno el número de doble tipo System.out.println (dis.readboolean ()); // lee a giro el tipo booleano dos.close (); revelar(); } catch (ioException e) {E.PrintStackTrace (); }}}
Transmisión de impresión: Java.io proporciona transmisiones para la impresión. Este tipo de transmisión tiene la función de enjuague automáticamente al escribir, por lo que no hay necesidad de enjuague cada vez que imprime algo.
import java.io.*; public class testPrintStream1 {public static void main (string [] args) {printStream ps = null; Pruebe {FileOutputStream fos = new FileOutputStream ("f: //java//io/log.dat"); // Cree la transmisión de salida y especifique la ubicación de salida PS = new PrintStream (FOS); // Empaque la transmisión de impresión fuera de la transmisión} Catch (ioException e) {E.PrintStackTrace (); } if (ps! = null) {system.setOut (ps); // Establecer la impresión del sistema para imprimir la transmisión ps} int ln = 0; for (char c = 0; c <= 60000; c ++) {system.out.print (c+""); // No imprimir en la ventana DOS, la secuencia de salida se imprime directamente en el archivo especificado si (ln ++> = 100) {system.out.println (); ln = 0; }}}}