Las transmisiones son un concepto abstracto de secuencias de bytes.
Los archivos son formas de almacenamiento estáticas de datos, mientras que las secuencias se refieren al formulario cuando los datos se transmiten.
Las clases de transmisión se dividen en dos categorías principales: clases de transmisión de nodo y clases de flujo filtrado (también llamadas clases de flujo de proceso).
La clase correspondiente al dispositivo de destino se llama clase de flujo de nodo. El programa también puede llamar a la clase de flujo de nodo a través de una clase de flujo indirecto para lograr una lectura más flexible y conveniente de varios tipos de datos. Esta clase de flujo indirecto es la clase de flujo de filtro (también llamada clase de flujo de procesamiento) o la clase de empaque.
El proceso de llamada de la clase de envoltorio es el siguiente:
La relación entre la clasificación de flujo
No importa cuán rica y compleja sea la clasificación de las transmisiones, sus raíces provienen de cuatro clases básicas. La relación entre estas cuatro clases es la siguiente:
| Transmisión de bytes | Transmisión de carácter | |
| Flujo de entrada | InputStream | Lector |
| Flujo de salida | OutputStream | Escritor |
Unicode codifica caracteres almacenados en Java, y la clase de procesamiento de la secuencia de caracteres es responsable de convertir otras secuencias de caracteres codificadas externas y transmisiones de caracteres Unicode en Java. Las clases InputStreamReader y OutputStreamWriter manejan conversiones de transmisiones de caracteres y secuencias de bytes. Una secuencia de caracteres (puede manejar un búfer a la vez) es más eficiente en una operación que una corriente de byte (un byte a la vez).
InputStream
Dado que InputStream y OutputStream son clases ABSTACT, no pueden indicar a qué dispositivo IO corresponde. Hay muchas subclases debajo de ellos, incluidos dispositivos IO específicos, como redes, tuberías, memoria, archivos, etc., y sus diversos objetos de subclase utilizados en programas reales.
Nota: Llamamos a la fuente y el objetivo IO correspondiente a la clase de flujo de nodo el nodo de flujo (nodo).
Nota: Al escribir el contenido del archivo A al archivo B, el programa utiliza la clase de salida o la clase de entrada para el funcionamiento del archivo A. La clase de entrada y salida es relativa al programa, no en nombre del archivo, por lo que debemos crear una clase de entrada para completar la operación en el archivo A y una clase de salida para completar la operación en el archivo B.
OutputStream
Lector/escritor de transmisión orientado a los personajes
Una transmisión dirigida por caracteres Unicode significa leer desde la transmisión o escribir información en la transmisión en caracteres unicode. Del mismo modo, el lector/escritor también es la clase ABSTACT.
Lector
Escritor
Reutilización del código del programa IO:
Por lo general, al escribir código, use -1 como el final de la entrada del teclado, y no use el sistema. En la función escrita. Es solo que al llamar a la función, System.in se pasa como parámetro. De esta manera, cuando queremos leer los datos de un archivo en el futuro para reemplazar la entrada de teclado manual, podemos usar esta función directamente, por lo que el programa no necesita hacer demasiadas modificaciones, para lograr el efecto de no cambiar y adaptarse a los cambios.
Conversión de transmisiones de bytes y transmisiones de personajes
InputStreamReader y OutputStreamReader: convierte una transmisión orientada a bytes en una secuencia orientada a caracteres.
La clase InputStreamReader es un puente desde una secuencia de bytes hasta una secuencia de caracteres: se lee en los bytes y lo convierte en una secuencia de caracteres de acuerdo con el método de codificación especificado.
El nombre de codificación utilizado puede especificarse por el nombre, o el método de codificación predeterminado aceptable para la plataforma.
Cada llamada a uno de los métodos Read () de InputStreamReader puede hacer que se lean uno o más bytes desde la secuencia de entrada de bytes base.
Para lograr una mayor eficiencia, considere encapsular el InputStreamReader con BufferedReader.
BufferedReader in = new BufferedReader (new InputStreamReader (System.in));
Un resumen del uso de la transmisión de Java
He encontrado muchas corrientes de Java en mi trabajo más profesional, y el resumen es el siguiente:
1. Generar formato postal. Lo que encuentra es generar archivos zip en un servlet, emitirlos al cliente web y descargarlos directamente.
respuesta.setContentType ("Aplicación/Zip"); Respuesta.AddHeader ("Content-Disposition", "Adjunto; FileName =/" xxx.zip/ ""); ZipOutputStream out = new ZipOutputStream (respuesta.getOutputStream ()) for () {ZipEntry Entry = new ZipEntry ("AA" + I ".dat"); out.putNewEntry (entrada); bytes [] bt = s.getBytes (); out.writytes (bt, 0, bt.length ()); out.closeEntry (); } out.flush (); out.close (); ZipoutputStream hereda de java.io.filteroutputstream. Por lo tanto, la operación de escritura real se escribe a través del parámetro outtream Out.
Su escritura nula (byte [] b, int off, int len) finalmente llama.
Si desea generar un archivo ZIP, escriba nuevo ZipoutputStream (nuevo FileOutputStream (PATH));
2. Escritura similar XML.
XMLWriter Writer = new XMLWriter (nuevo FileOutputStream (ruta), formatter)
Writer.Write (DOC). El principio es similar al anterior
3. Escribe archivos de texto y agrégalos.
Printstream ps = new printStream (new FileOutputStream (ruta, true), "UTF-8") Ps.Println (s); // puede escribir varios tipos como booleano, int, etc.PrintSteam también hereda de FilterOutputStream
DataOutputStream out = new DataOutputStream (Socket.getOutputStream ()); out.writytes (BT); out.writboolean (boolean v);
DataOutputStream también es un FilterOutputStream.
5. Lea del texto
BufferedReader lector = new BufferedReader (nuevo FileReader (ruta)); lector.readline ();
El patrón BufferedReader es el mismo que el patrón de filtro anterior. Almacena un objeto en el que el objeto del lector se pasa como parámetro y se usa para leer.
La clase correspondiente a Java 1.0 de BufferedReader es BufferedInputStream, que es un FilterInputStream.
6. Lea desde el socket
BufferedInputStream es = new BufferedInputStream (Socket.GetInputStream ()); is.read (bt, 0, bt.length ());
Resumir:
La serie de transmisión de clase base es InputStream y OutputStream. Son clases abstractas y los únicos métodos requeridos son (tome la salida como ejemplo)
Void Write (int b) lanza ioexception; Void Write (Byte B []) lanza IoExceptionVoid Write (Byte B [], int Off, int Len)
Lo más básico es la operación de byte. El primer método parece escribir un entero, pero de hecho solo escribe un byte (los ocho bits más bajos). Su subclase se divide en dos series, una es operar directamente el dispositivo de salida. Lo que encontramos anteriormente son File (FileOutputStream) y la salida de Servlet (ServLetOutputStream). Otros usados comúnmente también son un bytearRayOutputStream, que se opera directamente en la memoria.
El siguiente es la serie FilterOutputStream, que recibe un parámetro de asiento del objeto OutputStream, y la operación de escritura real se completa a través del objeto. Por ejemplo, ZipOutputStream solo es responsable de generar datos comprimidos. En cuanto a si estos datos se escriben en archivos, memoria o servletResponse, los parámetros de entrada lo determinan. Este es el patrón del decorador.
Las operaciones de uso común en la serie de filtros incluyen printStream (proporcionando print, println, write (boolean [int, char, string]), y finalmente utilizando el método OUT.Write para escribirlo en bytes.
También hay DataOutputStream, que proporciona WriteByte/WriteBoolean/WriteDouble/WriteLong/Wiretutf y otros métodos.
También hay socket/zip y otras cosas que no se usan comúnmente.
La transmisión de Java es muy conveniente y complicada. La complejidad significa que implementar una función a menudo requiere múltiples clases, y hay múltiples combinaciones. Todavía necesita ser resumido en la práctica.