프로그램에는 파일이나 다른 곳에 데이터를 빠르게 쓰기 위한 요구 사항이 포함되는 경우가 많습니다. 그리고 이것은 질문을 제기합니다. 우리는 이것을 어떻게 해야 합니까? 어떤 클래스를 선택해야 할까요? 오늘 우리는 이 역할에 적합한 후보자인 BufferedWriter 클래스 를 알게 될 것입니다 .

BufferedWriter가 필요한 이유는 무엇입니까?

BufferedWriter는 버퍼링된 문자를 스트림에 쓰는 클래스입니다. 물리적 미디어에 액세스하는 횟수를 줄일 수 있습니다. 즉, 매번 하나의 문자를 쓰는 것이 아니라 버퍼에 데이터를 쓴 다음 모든 문자를 한 번에 매체에 씁니다.

이것은 쓰기 속도를 크게 증가시킵니다. 기본 버퍼 크기는 8192자이지만 생성자에서 새 크기를 지정하여 변경할 수 있습니다.


BufferedWriter(Writer in, int sz)

여기서 생성자의 첫 번째 인수는 작성하는 데이터를 수신할 스트림입니다. 그리고 sz 가 새 버퍼의 크기라는 것이 밝혀졌습니다 .

Java에는 BufferedReader 클래스도 있습니다. 이 클래스는 버퍼링된 데이터 읽기에 사용됩니다.

버퍼란 정확히 무엇입니까? 실제 예를 들어 보겠습니다. 버퍼는 슈퍼마켓의 바구니나 쇼핑 카트와 같습니다. 하나의 품목을 가지고 계산대로 걸어가서 지불하고 차 트렁크에 넣은 다음 다른 품목을 위해 다시 오는 대신 쇼핑 카트를 가지고 원하는 모든 것을 넣은 다음 지불할 수 있습니다. 계산대에서. 이것이 바로 버퍼가 작동하는 방식입니다. 데이터를 수집한 다음 각 조각을 별도로 쓰는 대신 모든 것을 가져와서 씁니다.

BufferedWriter 클래스의 생성자 및 메서드

이제 BufferedWriter 클래스를 자세히 살펴보겠습니다 . 객체를 생성하기 위한 두 가지 생성자가 있습니다.


public BufferedWriter(Writer out) 
public BufferedWriter(Writer out, int sz)

두 생성자 모두에서 out은 쓸 스트림이고 sz 는 이미 언급한 대로 버퍼의 크기입니다.

BufferedWriter 클래스 에는 여러 메서드도 있습니다. 오늘 그 중 일부를 자세히 살펴보겠습니다.

쓰기(문자[] 배열) 버퍼에 char 배열을 씁니다.
write(String s, int off, int len) 문자열의 일부를 버퍼에 씁니다.
추가(문자 C) 버퍼에 문자 쓰기
추가(CharSequence csq, int 시작, int 끝) 배열의 일부를 버퍼에 씁니다.
newLine() 줄 구분 기호를 씁니다.
플러시() 스트림을 플러시합니다.

파일에 값을 쓰는 프로그램을 작성해 봅시다. 을 위해작가매개변수, 우리는FileWriter생성자에게. 텍스트 파일을 작성하는 데 사용되며 개체를 초기화하는 여러 생성자가 있습니다.

FileWriter(파일 파일)
FileWriter(파일 파일, 부울 추가)
FileWriter(FileDescriptor fd)
FileWriter(문자열 파일 이름)
FileWriter(문자열 파일 이름, 부울 추가)

이 예에서는 파일 이름을 사용하는 생성자를 사용합니다.


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message);
	bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
 }

우리 코드는 write(String str) 메서드를 사용하여 str을 file.txt 파일 에 씁니다 .

다음과 같은 다른 작성 방법이 있습니다.

  • write(char[] array ) — 이 변형은 char 배열을 받아 씁니다 .

  • write(String s, int off, int len) — 이 변형은 문자열 s를 취합니다 . 쓰기를 시작할 문자의 인덱스인 오프셋 off ; len 기록할 문자열(하위 문자열)의 길이입니다.


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message, 0, 11);
 	bufferedWriter.flush();

} catch(IOException ex) {
System.out.println(ex.getMessage());
}

이 코드는 파일에 "Hello, Amig"를 쓸 것입니다. 메서드에 인덱스 0부터 시작하여 11자를 쓰도록 지시했기 때문입니다.

우리 코드에는 try-with 리소스 블록 도 있습니다 .


try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt"))) 

이것은 close() 메서드가 내 컴퓨터에서 자동으로 호출됨을 의미합니다.bufferedWriterAutoCloseable 인터페이스를 구현하기 때문입니다 .

코드의 flush() 메서드는 출력 스트림을 플러시하여 버퍼링된 모든 바이트를 강제로 작성하는 데 사용 됩니다 . 버퍼를 플러시해야 하고 버퍼링된 바이트를 써야 함을 나타내기 때문에 이 호출 없이는 쓰기가 발생하지 않을 수 있습니다.

BufferedWriter 클래스에는 메시지에 새 줄을 추가하는 newLine() 메서드 있습니다 .


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
        String message = "Hello, Amigo! This is a very important message!";
        bufferedWriter.write(message, 0, 13);
        bufferedWriter.newLine();
        bufferedWriter.write(message, 15, 33);
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }

파일에서 다음을 얻습니다.

안녕, 아미고!
이것은 매우 중요한 메시지입니다!

append() 메서드 의 서명은 다음과 같습니다.


public Writer append(CharSequence csq, int start, int end)

csq 를 추가하는 데 사용됩니다 . 여기서 start 는 첫 번째 문자의 인덱스이고 end 는 삽입할 문자열(또는 하위 문자열)의 마지막 문자 인덱스입니다. 인덱스 끝이 있는 문자는 삽입되지 않습니다.


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
    String message = "Hello, Amigo! This is a very important message!";
    bufferedWriter.append(message, 0, 7);
    bufferedWriter.flush();
} catch (IOException ex) {
    System.out.println(ex.getMessage());
}

이 코드는 다음을 제공합니다.

안녕하세요,

즉, 추가 방법을 사용하여 버퍼에 추가할 문자열 부분을 지정합니다.

write()append() 의 차이점을 자세히 살펴보면 먼저 둘 다 원칙적으로 동일한 작업을 수행한다는 것을 알 수 있습니다. 즉, 값을 씁니다.

그러나 차이점은 추가 방법이 더 새롭고 CharSequence를 인수로 사용하며 String이 CharSequence를 구현하기 때문에 StringsStringBuildersStringBuffers를 추가 방법 에 전달할 수 있다는 것입니다 . 그러나 write() 메서드는 String 만 허용합니다 .

지금은 그게 다야! 오늘 우리는 버퍼, 파일에 버퍼링된 쓰기를 수행하는 방법 및 이를 수행하는 데 사용할 수 있는 방법에 대해 알아보았습니다.