Bufferedinputstream
BufferedInputStream es una secuencia de entrada tamponada. Hereda de FilterInputStream.
El propósito de BufferedInputStream es agregar algunas características a otra secuencia de entrada, como proporcionar "funcionalidad de almacenamiento en búfer" y soportar "marcas () marcas" y "restablecer () métodos de reinicio".
BufferedInputStream se implementa esencialmente a través de una matriz de búfer interno. Por ejemplo, después de crear un BufferedInputStream correspondiente a una determinada secuencia de entrada, cuando leemos los datos de la secuencia de entrada a través de Read (), el BufferedInputStream completará los datos de la secuencia de entrada en el búfer en lotes. Cada vez que se leen los datos en el búfer, el flujo de entrada volverá a llenar el búfer de datos; Esto se repetirá hasta que hayamos terminado de leer la ubicación de los datos del flujo de entrada.
Lista de funciones BufferedInputStream:
BufferedInputStream (InputStream in) BufferedInputStream (inputStream in, int size) sincronizado int disponible () void Close () sincronizado Void Mark (int readlimit) boolean Marksupported () sincronizado int () sincronizado int (byte [] buffer, int compensación, int byteDes bytecount)
Código de muestra:
Para obtener un uso detallado de API en BufferedInputStream, consulte el código de ejemplo (BufferedInputStreamTest.java):
import java.io.BufferedInputStream;import java.io.ByteArrayInputStream;import java.io.File;import java.io.InputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.FileNotFoundException;import java.lang.SecurityException;/** * BufferedInputStream Test Program * * @author Skywang */public class BufferedInputStreamTest {private static final int len = 5; public static void main (string [] args) {testBufferedInputStream (); } / *** Función de prueba API de BufferedInputStream* / private static void testBufferedInputStream () {// Cree una transmisión de byte BufferedInputStream, el contenido es una matriz de ArrayLetters pruebe {archivo de archivo = nuevo archivo ("bufferedInputStream.txt"); InputStream in = new BufferedInputStream (nuevo FileInputStream (File), 512); // Leer 5 bytes de la transmisión de bytes. "ABCDE", A corresponde a 0x61, b corresponde a 0x62, y así sucesivamente ... para (int i = 0; i <len; i ++) {// Si puede continuar leyendo el siguiente byte, leer el siguiente byte if (in.available ()> = 0) {// leer "el siguiente byte de transmisión" int tmp = in.read (); System.out.printf ("%d: 0x%s/n", i, integer.tohexstring (tmp)); }} // Si "esta transmisión de byte" no admite la función de marcado, salga directamente si (! In.marksupported ()) {system.out.println ("¡no sea compatible!"); devolver ; } // marque "posición de índice de corriente", es decir, marque el elemento de la sexta posición - "f" // 1024 corresponde a marklimit in.mark (1024); // omita 22 bytes. in.skip (22); // leer 5 bytes byte [] buf = new Byte [len]; in.read (buf, 0, len); // Convertir BUF en una cadena de cadena. Cadena str1 = nueva cadena (buf); System.out.printf ("str1 =%s/n", str1); // Restablecer el "índice de la secuencia de entrada" a la posición marcada por Mark (), es decir, restablecer a "f". in.reset (); // Leer 5 bytes en BUF de "Reset Byte Stream". Es decir, lea "fghij" in.read (buf, 0, len); // Convertir BUF en una cadena de cadena. Cadena str2 = nueva cadena (buf); System.out.printf ("str2 =%s/n", str2); cercar(); } catch (FileNotFoundException e) {E.PrintStackTrace (); } catch (SecurityException e) {E.PrintStackTrace (); } catch (ioException e) {E.PrintStackTrace (); }}} El contenido de BufferedInputStream.txt Leer en el programa es el siguiente:
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Resultados de ejecución:
0: 0x611: 0x622: 0x633: 0x644: 0x65Str1 = 01234Str2 = fghij
BufferedOutputStream
BufferedOutputStream es una secuencia de salida amortiguada. Hereda de FilterOutputStream.
La función de BufferedOutputStream es proporcionar "búfer" a otra secuencia de salida.
Lista de funciones BufferedOutputStream:
BufferedOutputStream (OutputStream Out) BuffeDoutputStream (OutputStream Out, Int Size) sincronizado Close () sincronizado Void Flush () sincronizado Void Write (byte [] buffer, int compensación, int long) sincronized void write (int oneByte)
Código de muestra:
Para obtener un uso detallado de API en BufferedOutputStream, consulte el código de ejemplo (BufferedOutputStreamTest.java):
import java.io.BufferedOutputStream;import java.io.File;import java.io.OutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.FileNotFoundException;import java.lang.SecurityException;import java.util.Scanner;/** * BufferedOutputStream Test program* * @author Skywang */public class BufferedOutputPutStreamTest {private static final int len = 5; // correspondiente a las letras inglesas "abcddefghijklmnopqrsstttuvwxyz" byte final estático privado [] arrayletters = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6e, 0x6e, 0x6e. 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a}; public static void main (string [] args) {testBufferedOutputStream (); } / *** Función de prueba de API de BufferedOutputStream* / Private static void testBufferedOutputStream () {// Cree el bufferedOutputStream correspondiente al "flujo de salida de archivo" // su tamaño de búfer correspondiente es 16, es decir, cuando los datos de buffer> = 16, el contenido del buffer se escribirá automáticamente a la transmisión de salida. intente {archivo archivo = nuevo archivo ("out.txt"); OutputStream out = new BufferedOutputStream (nuevo FileOutputStream (archivo), 16); // Escribe los primeros 10 bytes de la matriz ArrayLetters a la transmisión de salida. Write (Arrayletters, 0, 10); // Escribe la "Newline/n" a la salida stream out.write ('/n'); // ¡HACER! // out.flush (); readUserInput (); out.close (); } catch (FileNotFoundException e) {E.PrintStackTrace (); } catch (SecurityException e) {E.PrintStackTrace (); } catch (ioException e) {E.PrintStackTrace (); }} / *** Lea la entrada del usuario* / private static void readUserInput () {System.out.println ("Ingrese un texto:"); Lector de escáner = new Scanner (System.in); // espera una cadena de entrada str = lector.next (); System.out.printf ("La entrada es: %s/n", str); }} Resultados de ejecución:
Genere el archivo "out.txt", y el contenido del archivo es "ABCDEFGHIJ".
Prueba paso a paso: siga los siguientes tres pasos para probar el programa para ver el tamaño del búfer y el papel de FLUSH ().
Tipo 1: programa original
(1) Ejecute el programa. Cuando el programa esté esperando la entrada del usuario, verifique el contenido de texto de "out.txt"; Buscar: el contenido está vacío.
(2) Ejecute el programa. Después de la entrada del usuario, verifique el contenido de texto de "out.txt"; Find: El contenido es "ABCDEFGHIJ".
De esto, encontramos que los resultados de (01) y (02) son diferentes; La razón por la cual el contenido out.txt en (01) está vacío es porque el tamaño del búfer correspondiente a OUT.
El contenido correspondiente a OUT.txt es "ABCDEFGHIJ", porque se ejecuta out.close (), que cierra la secuencia de salida; Antes de cerrar la transmisión de salida, los datos del búfer se escribirán en la secuencia de salida.
Nota: Al volver a probar, primero elimine out.txt.
Tipo 2: Agregue la siguiente declaración antes de ReadUserInput ()
out.flush ();
El propósito de esta oración es escribir el "contenido de búfer" en la transmisión de salida.
(1) Ejecute el programa. Cuando el programa esté esperando la entrada del usuario, verifique el contenido de texto de "out.txt"; Find: El contenido es "ABCDEFGHIJ".
(2) Ejecute el programa. Después de la entrada del usuario, verifique el contenido de texto de "out.txt"; Find: El contenido es "ABCDEFGHIJ".
A partir de esto, encontramos que el mismo resultado que (01) y (02), el contenido correspondiente de out.txt es "ABCDEFGHIJ". Esto se debe a que se realiza la operación FLUSH (), que se utiliza para escribir los datos del búfer en la secuencia de salida.
Nota: Al volver a probar, elimine primero. ¡TXT!
Tipo 3: Basado en el primer tipo,
out.write (Arrayletters, 0, 10);
Modificado a
out.write (Arrayletters, 0, 20);
(1) Ejecute el programa. Cuando el programa esté esperando la entrada del usuario, verifique el contenido de texto de "out.txt"; Encuentre que el contenido es "ABCDEFGHIJKLMNOPQRST" (excluyendo Enter).
(02) Ejecute el programa. Después de la entrada del usuario, verifique el contenido de texto de "out.txt"; Encuentre que el contenido es "abcdefghijklmnopqrst" (incluido Enter).
A partir de esto, encontramos que (01) el resultado de la ejecución es "ABCDEFGHIJKLMNOPQRST" (excluyendo el retorno del transporte). Esto se debe a que el tamaño del búfer es 16, y escribimos 20 bytes a través de Out.Write (Arrayletters, 0, 20), que excede el tamaño del búfer; En este momento, todas las entradas se escribirán directamente en la secuencia de salida sin pasar a través del búfer.
(3) El resultado de la operación es "ABCDEFGHIJKLMNOPQRST" (incluido el retorno del carro), porque al ejecutar out.close (), el símbolo de retorno de carro '/n' se escribe en la corriente de salida.
Nota: Al volver a probar, elimine primero. ¡TXT!