2013-07-29 3 views
0

버퍼를 초과하여 버퍼를 자동으로 플러시해야하는 시간을 알고 싶습니다.BufferWriter automatic flushing

try 
    { 
     BufferedWriter br = new BufferedWriter(new FileWriter(file),1); 

      br.write("How much should I write in order to get it flushed without using .flush() nor close()); 

나는) (가까운 자동으로 버퍼를 플래시 것을 알고 있지만, 나는 또한 알고 그 버퍼가 가득이며 그래서 다시 얼마나 그것을 플러시하고 더 입력을 취득하는 이상의 입력 .. 를 수신하면 생성자에서 지정한 크기 인 1을 극복하기 위해 작성해야합니까? 꽤 많이 입력했는데 결과가 없습니다. 추 신 : 버퍼가 장면 뒤에서 어떻게 작동하는지 이해하는 것입니다.

미리 감사드립니다. 우리는 BufferedWriter의 소스 코드에서 볼 수 있듯이

+0

BufferedWriter의 소스를 살펴 보시지 않겠습니까? – Kayaman

+0

오, 당신은 bufferesize로 1을 통과하고 있습니다! – rocketboy

+0

@rocketboy 버퍼 크기를 지정할 수있는 생성자를 사용했습니다. 그리고 Kayman이 제안한대로 소스 코드도 확인했는데 실제로 size 1의 char []를 만들었습니다. 01은 2 개의 chars 이후에 플러시되어야하지만 일어나지 않습니다. – Rollerball

답변

1

BufferedWriterwrite 방법 중 하나에 대한 Java 소스에서 찾고, 당신은, 차례로, out.write(...)를 호출 flushBuffer 메서드 호출을 게재합니다. out.flush()으로 전화하지 않습니다.

이 더 이해할 수있는 측면에서 의미 : flush에 반대

예, (아닌 실제 파일을 그것은 모든 문자 후 플래시합니다,하지만 (이 경우 FileWriter) Writer를 기본으로 플래시합니다 는 flushBufferout.flush()을 호출하여 기본 파일 Writer을 실제 파일로 플러시합니다. FileWriter에는 플러시가 발생하는 자체 일정이 있습니다 (완전히 확신 할 수는 없지만 버퍼 크기가 StreamEncoder8192에 정의 된 기본값이라고 생각합니다).

+0

그래, defaul 버퍼 사이즈 (FileWriter)를 사용합니다. write (String s)의 소스 코드가 (Writer, int size)로 작성된 경우에도 버퍼 크기를 표준으로 되돌릴 수는 있지만 ok입니다. – Rollerball

+0

전체적인 관점에서 볼 때, 생성자가 크기를 취하는 것이 표준 버퍼보다 ​​더 큰 버퍼를 필요로하기 때문에 이해할 수 있습니다. 더 작은 버퍼가 필요한 경우가 아니라 (별로 의미가 없음). 그러나 두 개의 기본 버퍼가 하나씩 다른 버퍼에 래핑되므로 원시 플러시 전에 사용할 수있는 총 버퍼가 16384가됩니다. 권리? – Rollerball

+0

@ Rollerball 예, 그렇습니다. – Dukeling

0

은 버퍼가 가득 찬 경우가 확인하는 다음 문자를 작성하기 전에 문자 버퍼의 기본 크기

private char cb[]; 

= 8192를 만들고 true의 경우는 그것을 플러시합니다. 당신은 기본 버퍼 크기 BufferWriter을 만든 경우

... 
if (nextChar >= nChars) 
    flushBuffer(); 
cb[nextChar++] = (char) c; 
... 

는 것을, 당신은 Writer 계약에 따르면

+0

'write (String)'은'write (int)'를 호출하지 않습니다. (그 코드를 복사 한 곳으로 보입니다) ... – Dukeling

+0

@Evgeniy Dorofeev 그래서 왜 호출하지 않고 파일에서 printeted를 얻지 못합니까? flush() 또는 close(). 버퍼 크기를 1로 설정하여 최대 2자를 취해 플러시해야합니다. 그것은 그렇게하지 않습니다. – Rollerball

1

가 플러시하기 위해 8193 개 문자를 작성해야합니다. Writer로 작업을 완료하면 close()를 호출하여 데이터 쓰기를 마친 후 리소스를 닫을 수 있습니다 (이 경우 File 핸들러는 file). 그 외에는

, 같은 당신이 사용하는 작가의 구현이 변경하는 경우가 자바의 향후 버전에서 변경 또는 수 있기 때문에 당신을 염려하지 말아야 버퍼 크기로 구현 세부 사항.

또한 버퍼링 라이터의 요점은 실제로 버퍼에 대량의 데이터 청크를 수집하고 한 번에 전체 버퍼를 작성하여 디스크에 기록되고, 판독 횟수를 감소시키는 것이다. 1의 버퍼로 BufferedWriter를 작성하면 (자),이 목적을 무효로합니다.