В предыдущих разделах мы узнали о потоках ввода и вывода файловых байтов и потоках ввода и вывода файловых символов. В этом разделе мы изучаем новую концепцию — буферизованные потоки . Так что же такое буферизованный поток? Какую роль могут играть буферные потоки?
В Java мы называем объекты, созданные классами BufferedReader и BufferedWriter, буферизованными потоками ввода и вывода, которые расширяют возможности чтения и записи файлов. Например, Student.txt — это список студентов, каждое имя которого занимает одну строку. Если мы хотим прочитать имя, мы должны читать по одной строке. Выполнить такую задачу с помощью потока FileReader сложно, потому что мы не знаем, сколько символов в строке, а класс FileReader этого не знает. предоставить метод для чтения строки.
Java предоставляет более сложные потоки: поток BufferedReader и поток BufferedWriter. Источником и местом назначения обоих должны быть поток ввода символов и поток вывода символов. Следовательно, если входной поток файловых символов используется в качестве источника потока BufferedReader, а выходной поток файловых символов используется в качестве назначения потока BufferedWriter, то потоки, созданные классами BufferedReader и BufferedWriter, будут иметь более сильное чтение и запись. возможности, чем поток ввода символов и поток вывода символов. Например, поток BufferedReader может читать файлы построчно.
Конструкторы классов BufferedReader и BufferedWriter:
BufferedReader(Reader);BufferedWriter(Запись);
Потоки BufferedReader могут читать строки текста с помощью readLine() . Создайте объект BufferedReader, передав объект подкласса Reader, например экземпляр FileReader, в BufferedReader, например:
FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=BufferedReader(inOne);
Затем поток inTwo вызывает метод readLine() для чтения Student.txt, например:
StringstrLine=inTwo.readLine();
Аналогичным образом вы можете соединить потоки BufferedWriter и поток FileWriter вместе, а затем использовать поток BufferedWriter для записи данных в пункт назначения, например:
FileWritertofile = newFileWriter (hello.txt); BufferedWriterout = BufferedWriter (tofile);
Затем out использует метод write(String s, int off, int len) класса BufferedReader для записи строки s в файл hello.txt. Параметр off — это смещение от начала s, а len — количество записанных символов. .
Кроме того, поток BufferedWriter имеет уникальный метод записи символа новой строки в файл:
новаяЛиния();
BufferedReader и BufferedWriter можно назвать верхним потоком, а поток символов, на который они указывают, называется базовым потоком. Java использует технологию кэширования для соединения верхнего потока и базового потока. Базовый поток ввода символов сначала считывает данные в кэш, затем поток BufferedReader считывает данные из кэша; поток BufferedWriter записывает данные в кэш, а базовый поток вывода символов непрерывно записывает данные в кэш в место назначения; . Когда поток BufferedWriter вызывает методlush() для обновления кэша или вызывает метод close() для закрытия, даже если кэш не переполняется, базовый поток немедленно запишет кэшированное содержимое в место назначения.
Примечание . При закрытии выходного потока необходимо сначала закрыть буферизованный выходной поток, а затем закрыть поток, на который указывает буферизованный выходной поток, то есть сначала закрыть верхний поток, а затем закрыть нижний поток. Просто закройте верхний поток при написании кода, и основной поток верхнего потока будет закрыт автоматически.
Например:
Файл english.txt, состоящий из английских предложений, выглядит следующим образом, каждое предложение занимает одну строку:
Стрела не попала в цель. Они отвергли требование профсоюза. Куда ведет эта дорога?
Требуется прочитать english.txt построчно, добавить после строки количество слов, содержащихся в английском предложении, а затем записать строку в файл с именем englishCount.txt. Код следующий:
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+количество слов в предложении:+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());}}}
Результаты бега следующие:
Содержимое englishCount.txt:Стрелка промахнулась.Количество слов в предложении:5Они отвергли требование союза.Количество слов в предложении:5Куда ведет эта дорога?Количество слов в предложении:6