이전 섹션에서는 파일 바이트 입력 및 출력 스트림과 파일 문자 입력 및 출력 스트림에 대해 배웠습니다. 이 섹션에서는 버퍼링된 스트림 이라는 새로운 개념을 배웁니다. 그렇다면 버퍼링된 스트림이란 무엇입니까? 버퍼 스트림은 어떤 역할을 할 수 있나요?
Java에서는 BufferedReader 및 BufferedWriter 클래스에 의해 생성된 객체를 버퍼링된 입력 및 출력 스트림으로 호출하여 파일을 읽고 쓰는 기능을 향상시킵니다. 예를 들어 Student.txt는 각 이름이 한 줄을 차지하는 학생 목록입니다. 이름을 읽으려면 한 번에 한 줄씩 읽어야 합니다. 한 줄에 몇 개의 문자가 있는지 알 수 없고 FileReader 클래스도 모르기 때문에 FileReader 스트림을 사용하여 이러한 작업을 완료하는 것은 어렵습니다. 한 줄을 읽는 방법을 제공합니다.
Java는 고급 스트림인 BufferedReader 스트림과 BufferedWriter 스트림을 제공합니다. 둘 다의 소스와 대상은 문자 입력 스트림과 문자 출력 스트림이어야 합니다. 따라서 파일 문자 입력 스트림이 BufferedReader 스트림의 소스로 사용되고 파일 문자 출력 스트림이 BufferedWriter 스트림의 대상으로 사용되는 경우 BufferedReader 및 BufferedWriter 클래스에 의해 생성된 스트림은 더 강력한 읽기 및 쓰기 기능을 갖습니다. 문자 입력 스트림 및 문자 출력 스트림 기능보다 더 많은 기능이 있습니다. 예를 들어 BufferedReader 스트림은 파일을 한 줄씩 읽을 수 있습니다.
BufferedReader 클래스와 BufferedWriter의 생성자는 다음과 같습니다.
BufferedReader(Readerin);BufferedWriter(Writerout);
BufferedReader 스트림은 readLine() 을 사용하여 텍스트 줄을 읽을 수 있습니다. FileReader의 인스턴스와 같은 Reader 하위 클래스의 개체를 BufferedReader에 전달하여 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은 BufferedReader 클래스의 write(String s, int off, int len) 메소드를 사용하여 문자열 s를 hello.txt에 씁니다. 매개변수 off는 s의 시작 부분으로부터의 오프셋이고 len은 쓰여진 문자 수입니다. .
또한 BufferedWriter 스트림에는 파일에 개행 문자를 쓰는 고유한 방법이 있습니다.
newLine();
BufferedReader 및 BufferedWriter는 상위 스트림이라고 할 수 있으며, 이들이 가리키는 문자 스트림을 기본 스트림이라고 합니다. Java는 캐싱 기술을 사용하여 상위 스트림과 기본 스트림을 연결합니다. 기본 문자 입력 스트림은 먼저 데이터를 캐시로 읽고, BufferedReader 스트림은 캐시에서 데이터를 읽습니다. BufferedWriter 스트림은 데이터를 캐시에 쓰고, 기본 문자 출력 스트림은 계속해서 캐시의 데이터를 대상에 씁니다. . BufferedWriter 스트림이 플러시()를 호출하여 캐시를 새로 고치거나 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 내용:Thearrowmissedthetarget.문장에 있는 단어 수:5Theyrejectedtheuniondemand.문장에 있는 단어 수:5이 길은 어디로 가는가?문장에 있는 단어 수:6