2011-01-09 11 views
19

생성자의 버퍼 크기 감각은 무엇입니까? 내가 프로그램을 쓴 것처럼BufferedReader의 버퍼 크기는 얼마입니까?

BufferedReader(Reader in, int size) 

:

import java.io.*; 
class bufferedReaderEx{ 
    public static void main(String args[]){ 
     InputStreamReader isr = null; 
     BufferedReader br = null; 
      try{ 
       isr = new InputStreamReader(System.in); 
//    System.out.println("Write data: "); 
//    int i = isr.read(); 
//    System.out.println("Data read is: " + i); 
       //Thus the InputStreamReader is useful for reading the character from the stream 
       System.out.println("Enter the data to be read by the bufferedReader: "); 
       //here isr is containing the lnefeed already so this is needed to be flushed. 
       br = new BufferedReader(isr, 2); 
       String str = br.readLine(); 
       System.out.println("The data is : :" + str); 
      }catch(IOException e){ 
       System.out.println("Can't read: " + e.getMessage()); 
      } 
    } 
} 

출력 :

Enter the data to be read by the bufferedReader: Hello world and hello world again 
The data is: Hello world and hello world again 

그리고 내가 그것을 두 개의 문자를 읽어 것이라고 의도 한대로 버퍼 크기가 의미하는 일. 그러나 그것은 그렇지 않았습니다.

답변

29

BufferedReader은 이름이 말하는대로 입력을 버퍼링합니다. 즉, 입력 소스에서 버퍼로 읽은 다음 전달합니다. 여기서 버퍼 크기는 버퍼하는 바이트 수를 나타냅니다.

대부분의 출처에서 나온 입력을 읽는 것은 매우 느립니다. 프로그램이 대부분의 시간 동안 입력을 기다릴 가능성이 높기 때문에 단지 2 바이트의 버퍼가 성능을 저하시킵니다. 버퍼 크기가 2 인 경우 100 바이트를 읽으면 메모리 내 버퍼에서 2 바이트를 읽고 (매우 빠름), 버퍼를 채우고 (매우 느리게), 버퍼에서 2 바이트를 읽고 (매우 빠름), 버퍼 (매우 느림) 등 - 전반적으로 매우 느립니다. 버퍼 크기가 100이면 100 바이트를 읽음으로써 전체 메모리가 매우 빠르게 빨라집니다 (매우 빠름). 이것은 버퍼가 100 바이트를 포함하고 있다고 가정합니다. 여러분의 경우와 같이 합리적인 가정이 필요한 경우입니다.

현재 수행중인 작업을 알지 못하는 경우, 매우 큰 기본 버퍼 크기를 사용해야합니다. 버퍼가 작아지는 한 가지 이유는 제한된 메모리 장치에서 실행될 때 버퍼가 메모리를 소비하기 때문입니다.

+0

그러면 버퍼 크기의 의미는 무엇입니까? 설명해 주시겠습니까? – codeomnitrix

+1

@codeonnitrix 약간의 설명이 추가되었습니다. 그게 충분한 지 알려주세요. – marcog

+0

감사합니다 marcog .. – codeomnitrix

0

입력 버퍼의 크기입니다. javadoc에서 자세히 읽으십시오.

+0

안녕하세요, 저는 이미 버퍼 크기 나 버퍼 크기가 더 커지면 어떤 효과가 있는지 알고 싶습니다. 나는 그 의미가 무엇인지 의미한다. 내 말은 버퍼 크기가 12000 또는 200 일 때 무엇을 사용해야 하는지를 의미합니다. – codeomnitrix

+1

크기가 12000 인 버퍼는 더 많은 메모리를 사용하지만 더 빨리 작동합니다. 200 대신 느린 작동하지만 메모리 사용량은 적습니다. * 큰 데이터 크기에서는 느리고/빠릅니다. –

+0

그렇다면 매번 작업이 완료 될 것이라는 것을 의미하지만 이전 20000 블록에서는 2 라운드가 걸리고 다른 하나에서는 100 라운드가 걸릴 것입니다. 그렇지? – codeomnitrix

9

파일을 읽거나 쓸 때 실제로 파일에 액세스하는 커널에 액세스해야합니다. 모든 파일 작업은 커널을 통과해야합니다. 이것은 상당히 비싼 작업입니다. 버퍼링은 바이트 청크를 읽도록합니다. 이들은 RAM의 임시 위치에 보관되며이 위치에서 바이트를 읽습니다. 이런 방식으로, 파일 IO를 커널이 자주 요청하지는 않습니다.

거대한 버퍼 크기를 사용하면 RAM을 불필요하게 늘릴 수 있습니다. 작은 파일을 사용하는 경우 파일 요청에 대해 커널을 계속 괴롭 히게됩니다. 기본값을 사용하는 것이 가장 좋습니다. 버퍼 크기 및 실험을 지정할 수 있습니다. 대부분의 기계는 한 번에 한 섹터 또는 정수 섹터를 읽습니다. 섹터 크기는 시스템을 포맷하는 방법에 따라 다릅니다.

다음 실험이 흥미 롭습니다. 그 안에 1,000,000 개의 제로가있는 파일을 만듭니다. OS의 타이밍 기능을 사용하여 다른 파일로 복사하는 속도를 확인하십시오 (버퍼링 된 버퍼링되지 않은 IO로 복사 프로그램 작성). 기본값을 포함하여 다양한 버퍼 크기로 시간을 측정하십시오. 이 자바 문서 당으로

8

http://www.docjar.com/html/api/java/io/BufferedReader.java.html

는 기본 버퍼 크기는 8192 개 문자 용량입니다. 줄 크기는 80 자 용량으로 간주됩니다.

8192 버퍼 크기는 파일 크기가 작은 경우에 충분합니다. 그러나 이것은 다시 성장할 수 있습니다. 파일에 8192 문자 이상이 포함되어 있으면 bufferedreader의 fill 메서드는 파일에서 내용을 읽기 전에 버퍼 크기를 늘립니다.큰 콘텐츠 파일의 경우 생성자를 통해 버퍼링 된 독자를 만드는 동안 버퍼에 자체 최대 크기를 설정하는 것이 좋습니다. 따라서 메모리를 다시 만들고 피할 수 있도록 새로 만든 배열에 이전 배열을 복사하면됩니다.

+0

스트레이트 포워드 및 클리어 컷 정보 [email protected] –

+0

버퍼가 실제로 커지지 않습니다. 일정한 크기입니다. 파일에서 읽을 때 중간 메모리 내 저장소로 사용됩니다. 나는 더 많은 것을 설명하기 위해 게으르다. 그래서 이것을 보라 : https://stackoverflow.com/questions/648309/what-does-it-mean-by-buffer – gargii

관련 문제