En las secciones anteriores aprendimos sobre los flujos de entrada y salida de bytes de archivos y los flujos de entrada y salida de caracteres de archivos. En esta sección aprendemos un nuevo concepto: flujos almacenados en búfer . Entonces, ¿qué es una transmisión almacenada en búfer? ¿Qué papel pueden desempeñar los flujos de búfer?
En Java, llamamos a los objetos creados por las clases BufferedReader y BufferedWriter flujos de entrada y salida almacenados en búfer, lo que mejora la capacidad de leer y escribir archivos. Por ejemplo, Student.txt es una lista de estudiantes y cada nombre ocupa una línea. Si queremos leer el nombre, debemos leer una línea a la vez. Es difícil completar dicha tarea usando la secuencia FileReader porque no sabemos cuántos caracteres hay en una línea y la clase FileReader no. Proporcionar un método para leer una línea.
Java proporciona flujos más avanzados: flujo BufferedReader y flujo BufferedWriter. El origen y el destino de ambos deben ser un flujo de entrada de caracteres y un flujo de salida de caracteres. Por lo tanto, si la secuencia de entrada de caracteres del archivo se usa como fuente de la secuencia BufferedReader y la secuencia de salida de caracteres del archivo se usa como destino de la secuencia BufferedWriter, entonces las secuencias creadas por las clases BufferedReader y BufferedWriter tendrán una lectura y escritura más sólidas. capacidades que el flujo de entrada de caracteres y la capacidad del flujo de salida de caracteres. Por ejemplo, una secuencia BufferedReader puede leer archivos línea por línea.
Los constructores de la clase BufferedReader y BufferedWriter son:
BufferedReader(Readerin);BufferedWriter(Writerout);
Las transmisiones de BufferedReader pueden leer líneas de texto usando readLine() . Cree un objeto BufferedReader pasando un objeto de una subclase Reader, como una instancia de FileReader, a BufferedReader, por ejemplo:
FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=BufferedReader(enUno);
Luego, inTwo stream llama al método readLine() para leer Student.txt, por ejemplo:
StringstrLine=inTwo.readLine();
De manera similar, puede conectar una secuencia BufferedWriter y una secuencia FileWriter juntas y luego usar la secuencia BufferedWriter para escribir datos en el destino, por ejemplo:
FileWritertofile=newFileWriter(hola.txt);BufferedWriterout=BufferedWriter(tofile);
Luego, out usa el método write(String s, int off, int len) de la clase BufferedReader para escribir la cadena s en hello.txt. El parámetro off es el desplazamiento desde el principio de s y len es el número de caracteres escritos. .
Además, la secuencia BufferedWriter tiene un método único para escribir un carácter de nueva línea en el archivo:
nuevaLínea();
BufferedReader y BufferedWriter se pueden llamar flujo superior, y el flujo de caracteres al que apuntan se llama flujo subyacente. Java utiliza tecnología de almacenamiento en caché para conectar el flujo superior y el flujo subyacente. El flujo de entrada de caracteres subyacente primero lee los datos en el caché, el flujo BufferedReader luego lee los datos del caché; el flujo BufferedWriter escribe los datos en el caché y el flujo de salida de caracteres subyacente escribe continuamente los datos en el caché en el destino. . Cuando la secuencia BufferedWriter llama a flush() para actualizar el caché o llama al método close() para cerrar, incluso si el caché no se desborda, la secuencia subyacente escribirá inmediatamente el contenido almacenado en caché en el destino.
Nota : Al cerrar el flujo de salida, primero debe cerrar el flujo de salida almacenado en el búfer y luego cerrar el flujo al que apunta el flujo de salida almacenado en el búfer, es decir, cerrar primero el flujo superior y luego cerrar el flujo inferior. Simplemente cierre la secuencia superior al escribir código, y la secuencia subyacente de la secuencia superior se cerrará automáticamente.
Por ejemplo:
El archivo english.txt compuesto por oraciones en inglés es el siguiente, cada oración ocupa una línea:
La flecha no dio en el blanco. Rechazaron la demanda sindical. ¿Adónde va este camino?
Es necesario leer english.txt línea por línea, agregar la cantidad de palabras contenidas en la oración en inglés después de la línea y luego escribir la línea en un archivo llamado englishCount.txt. El código es el siguiente:
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){FilefRead=newFile(english.txt);FilefWrite=newFile(englishCount.txt);try{Writerout=newFileWriter(fWrite);BufferedWriterbufferWrite= newBufferedWriter(out);Readerin=newFileReader(fRead);BufferedReaderbufferRead=newBufferedReader(in);Stringstr=null; while((str=bufferRead.readLine())!=null){StringTokenizerfenxi=newStringTokenizer(str);intcount=fenxi. countTokens();str=str+número de palabras en la oración:+count;bufferWrite.write(str);bufferWrite.newLine();}bufferWrite.close();out.close();in=newFileReader(fWrite) ;bufferRead =newBufferedReader(in);Strings=null;System.out.println(fWrite.getName()+content:); while((s=bufferRead.readLine())!=null){System.out.println( s) ;}bufferRead.close();in.close();}catch(IOExceptione){System.out.println(e.toString());}}}
Los resultados de ejecución son los siguientes:
englishCount.txt content:La flecha no alcanzó el objetivo.El número de palabras en la oración:5Rechazaron la demanda sindical.El número de palabras en la oración:5¿A dónde va este camino?El número de palabras en la oración:6