프로그램에는 파일이나 다른 곳에 데이터를 빠르게 쓰기 위한 요구 사항이 포함되는 경우가 많습니다. 그리고 이것은 질문을 제기합니다. 우리는 이것을 어떻게 해야 합니까? 어떤 클래스를 선택해야 할까요? 오늘 우리는 이 역할에 적합한 후보자인 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(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를 구현하기 때문에 Strings 및 StringBuilders 및 StringBuffers를 추가 방법 에 전달할 수 있다는 것입니다 . 그러나 write() 메서드는 String 만 허용합니다 .
지금은 그게 다야! 오늘 우리는 버퍼, 파일에 버퍼링된 쓰기를 수행하는 방법 및 이를 수행하는 데 사용할 수 있는 방법에 대해 알아보았습니다.
GO TO FULL VERSION