developer tip

FileWriter와 BufferedWriter의 Java 차이점

copycodes 2020. 11. 21. 10:30
반응형

FileWriter와 BufferedWriter의 Java 차이점


그것들의 차이점은 무엇입니까? Java ATM을 배우고 있지만 두 가지 방법으로 파일에 쓸 수있는 것 같습니다. 즉, 여기에서 try-catch 블록을 복사하지 않았습니다.

FileWriter file = new FileWriter("foo.txt");
file.write("foobar");
file.close();

FileWriter file = new FileWriter("foo.txt");
BufferedWriter bf = new BufferedWriter(file);
bf.write("foobar");
bf.close();

먼저 데이터 버퍼링의 개념을 이해합니다. 첫 번째 예제는 문자를 하나씩 쓰고 두 번째 첫 번째는 메모리에 버퍼링하고 한 번 쓴다는 의미입니까?


BufferedWriter는 다음과 같은 경우 더 효율적입니다.

  • 플러시 / 닫기 사이에 여러 쓰기가 있습니다.
  • 쓰기는 버퍼 크기에 비해 작습니다.

귀하의 예에서는 쓰기가 하나뿐이므로 BufferedWriter는 필요하지 않은 오버 헤드를 추가합니다.

첫 번째 예제는 문자를 하나씩 쓰고 두 번째 첫 번째 예제는 메모리에 버퍼링하고 한 번 쓴다는 의미입니다.

두 경우 모두 문자열이 한 번에 작성됩니다.

FileWriter 만 사용하는 경우 write (String) 호출

 public void write(String str, int off, int len) 
        // some code
        str.getChars(off, (off + len), cbuf, 0);
        write(cbuf, 0, len);
 }

이것은 write (String)에 대한 호출 당 하나의 시스템 호출을 만듭니다.


BufferedWriter가 효율성을 향상시키는 곳은 여러 개의 작은 쓰기입니다.

for(int i = 0; i < 100; i++) {
    writer.write("foorbar");
    writer.write(NEW_LINE);
}
writer.close();

BufferedWriter가 없으면 200 (2 * 100) 시스템 호출을 할 수 있고 비효율적 인 디스크에 쓸 수 있습니다. BufferedWriter를 사용하면 모두 함께 버퍼링 할 수 있으며 기본 버퍼 크기가 8192 자이므로 쓰기위한 시스템 호출이 1 개에 불과합니다.


당신이 옳습니다. 여기에 어떻게 write()방법 BufferedWriter외모 :

public void write(int c) throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (nextChar >= nChars)
            flushBuffer();
        cb[nextChar++] = (char) c;
    }
}

보시다시피 실제로 버퍼가 꽉 찼는 지 ( if (nextChar >= nChars)) 확인하고 버퍼를 플러시합니다. 그런 다음 버퍼 ( cb[nextChar++] = (char) c;)에 새 문자를 추가합니다 .


BufferedWriter가 더 효율적입니다. 메모리가 올바르게 작동하면 작은 쓰기를 저장하고 하나의 큰 청크로 씁니다. 작은 쓰기를 많이하는 경우 BufferedWriter를 사용합니다. 느린 OS에 쓰기 호출을 호출하면 가능한 한 적은 쓰기가 일반적으로 바람직합니다.


Java API 사양에서 :

FileWriter

문자 파일 작성을위한 편의 클래스. 이 클래스의 생성자는 기본 문자 인코딩과 기본 바이트 버퍼 크기가 허용된다고 가정합니다.

BufferedWriter

문자 출력 스트림에 텍스트를 작성하고 문자를 버퍼링하여 단일 문자, 배열 및 문자열을 효율적으로 작성합니다.


http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedWriter.html

In general, a Writer sends its output immediately to the underlying character or byte stream. Unless prompt output is required, it is advisable to wrap a BufferedWriter around any Writer whose write() operations may be costly, such as FileWriters and OutputStreamWriters. For example,

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

will buffer the PrintWriter's output to the file. Without buffering, each invocation of a print() method would cause characters to be converted into bytes that would then be written immediately to the file, which can be very inefficient.


In unbuffered Input/Output(FileWriter, FileReader) read or write request is handled directly by the underlying OS. https://hajsoftutorial.com/java/wp-content/uploads/2018/04/Unbuffered.gif

This can make a program much less efficient, since each such request often triggers disk access, network activity, or some other operation that is relatively expensive. To reduce this kind of overhead, the Java platform implements buffered I/O streams. The BufferedReader and BufferedWriter classes provide internal character buffers. Text that’s written to a buffered writer is stored in the internal buffer and only written to the underlying writer when the buffer fills up or is flushed. https://hajsoftutorial.com/java/wp-content/uploads/2018/04/bufferedoutput.gif

More https://hajsoftutorial.com/java-bufferedwriter/

참고URL : https://stackoverflow.com/questions/12350248/java-difference-between-filewriter-and-bufferedwriter

반응형