2013-07-08 4 views
7

난 항상 FileWriter을 사용하여 Java 파일의 텍스트를 작성했습니다. 분명히 BufferedOutputStream도 사용할 수 있습니다. 신중하게 두 javadocs를 모두 읽은 후에는 어떤 것이 더 빠르지/더 효율적인지 알 수 없습니다.성능 : BufferedOutputStream 대 FileWriter

나는 묻습니다.이 두 파일 I/O 방법간에 성능 차이가 있습니까 (최소 임에도 불구하고)? 그렇다면 그 이유는 무엇입니까? 그렇지 않다면, 왜 그들은 사실 동일합니까?

하나가 다른 시나리오보다 선호되는 시나리오가 있습니까? 미리 감사드립니다! BufferedOutputStream는 사용자가 제공해야 할 또 다른 바이너리 스트림에 쓰기 전에 메모리에 임의의 이진 데이터의 버퍼를 보유하는 동안

답변

9

FileWriterBufferedOutputStream을 실제로 비교하려면 텍스트 파일을 쓰는 것이 더 빠릅니다. I/O 작업이 적기 때문에 후자가 더 빠릅니다.

  • FileWriter의 경우, 쓰기 메소드에 대한 각 호출은 한 번에 지속됩니다 (버퍼링되지 않음).
  • BufferedOutputStream의 경우 버퍼가 가득 차면 (또는 버퍼가 flush 메서드를 사용하여 명시 적으로 플러시 된 경우) 데이터가 디스크에 기록됩니다.

하지만 텍스트 파일을 작성하는 경우, 당신은 Writer를 사용한다;

FileWriter fw = new FileWriter(...) 

BufferedWriter bw = new BufferedWriter(new FileWriter(...) 

보면 당신은 I/O 작업의 수에 대한 같은 상황이이 경우에 우리는 FileWriterBufferedWriter와 비교할 수 있습니다.


FileWriter

내부적 FileOutputStream 이용한다. FileWriter을 사용하는 이유는 파일에 쓸 때 (Java 내부 문자열이 예를 들어 UTF-8로 인코딩 됨) 자동으로 기본 문자 인코딩을 사용하기 때문입니다.당신이 OutputStream를 사용하는 경우, 각 쓰기에서 수동으로 인코딩 할 필요가 : 그래서

BufferedWriter이 예 :

bw.write("Hello"); 

BufferedOutputStream 동안 그 예에 해당합니다

bos.write("Hello".getBytes(Charset.forName("utf-8"))); 

경우 기본 인코딩은 utf-8입니다.

OutputStream은 (원시) 바이트를 처리하는 반면 Writer은 (텍스트) 문자를 처리합니다.

2

A는 FileWriter, 텍스트에 파일 기록합니다. 그들은 전혀 똑같은 일을하지 않으므로 그들의 성과를 비교하는 것은 의미가 없습니다.

일반적으로 버퍼링은 응용 프로그램 처리량을 향상 시키지만 대기 시간을 추가합니다. 파일의 경우 한 번에 더 큰 블록을 디스크로 전송할 수 있으므로 초당 더 많은 출력을 생성 할 수 있으므로 바이트 당 오버 헤드가 적습니다. 반면에 데이터가 메모리에 버퍼링되는 동안 디스크에 기록되지 않으므로 특정 바이트가 디스크에 기록되는 데 더 많은 시간이 걸립니다.

FileWriter의 경우 이미 문자를 바이트로 인코딩하는 데 도움이되는 내부 버퍼가 있습니다. 더 많은 버퍼링을 추가하는 것은 아마도 가치가 거의 없습니다.

+0

Thanks @ Joni (+1) - 재미있는 관찰이지만 'BufferedOutputStream'을 사용하여 파일에 텍스트를 쓸 수 없습니까?!? [이 기사] (http://www.javadb.com/write-to-file-using-bufferedoutputstream)는 다르게 생각하는 것 같다. 그 기사가 사실이라면,'FileWriter'와'BufferedOutputStream'은 2 가지 다른 용도로 쓰일 수도 있지만, 텍스트를 파일에 쓸 때 성능을 비교하는 것이 가능합니다. –

+0

다시, 매우 흥미로운 것들 @ 조니! [이 질문에 따라] (http://stackoverflow.com/questions/6108043/java-does-filewriter-use-a-buffer-it-acts-like-it-does-in-my-example)에 따르면 'FileWriter'가 사용하는 내부 버퍼를 오버라이드 (override) 할 수 있습니다. 내 자신의 즐거움을 위해서라면 이걸 시험해보고 싶습니다. 필자의 삶을 위해 나는'OutputStreamWriter'와'FileOutputStream'을 어떻게 설정하고 그들을'FileWriter' 생성자 - 어떤 아이디어로 주입시키는지를 알 수 없습니까? 그리고 새 버퍼 크기는 어디에 지정해야합니까? 지금까지 모든 위대한 도움에 다시 한번 감사드립니다! –

+0

기사에서 볼 수 있듯이 먼저 BufferedOutputStream을 사용하여 텍스트를 쓰기 위해 바이트를 수동으로 바이트로 변환합니다. 불편한 getBytes를 호출하여 즉시 가비지가되는 바이트 배열을 만듭니다 – Joni