0

바이트 레벨이 아닌 텍스트 레벨에서 파일 (일부 charset으로 인코딩 됨)을 읽길 원한다고 가정 해 봅시다. 그래서 Reader 클래스가 필요합니다.Buffered reader와 InputStreams의 가능한 네 스팅

독서를 버퍼링하고 싶다고합시다. 적어도 3 가지 방법이 있습니다.

public static void main(String[] args) throws Exception { 

    BufferedReader r1 = new BufferedReader(new FileReader("foo.txt")); 
    BufferedReader r2 = new BufferedReader(new InputStreamReader(new FileInputStream("foo.txt"))); 
    InputStreamReader r3 = new InputStreamReader(new BufferedInputStream(new FileInputStream("foo.txt"))); 
} 

R1과 R2는 거의 동일 InputStreamReader에서 FileReader 상속 이후이며, 실질적으로 그것의 기본 클래스에 InputStream을 넣습니다. 이 경우 버퍼링은 바이트가 텍스트로 디코딩 된 후 문자 수준에서 수행됩니다.

그러나 세 번째 경우는 버퍼링이 바이트 읽기와 텍스트 디코딩 사이에서 발생하기 때문에 다소 다릅니다. 버퍼링은 바이트가 텍스트로 디코딩되기 전에 발생합니다.

Mu 질문은 중요한 차이점이 있습니까? 이러한 경우 사이에 어떤 차이가 있습니까? 하나의 옵션이 다른 것보다 더 나은 경우가 있습니까? FileReader

답변

1

구현 :

public class FileReader extends InputStreamReader { 
    public FileReader(String fileName) throws FileNotFoundException { 
     super(new FileInputStream(fileName)); 
    } 
} 

그래서 당신이 볼

는 처음 두 줄은 정확히 같은 체인 초래한다.

세 번째 옵션은 성능에 좋지 않습니다. InputStreamReaderbyte 스트림에서 char 스트림으로의 문자 인코딩 변환이 필요합니다. 스트림은 바이트 단위로 느리지 만 블록 속도는 빠릅니다.

() 메소드는 하나 이상의 바이트를 초래할 수도있다하는 InputStreamReader의 리드들 중 하나의 각각의 호출은 하부 바이트의 입력 스트림으로부터 판독 할 :

InputStreamReader의 자바 독 참조. 바이트를 문자로 효율적으로 변환 할 수있게하려면 현재 읽기 작업을 충족시키는 데 필요한 것보다 많은 바이트가 기본 스트림에서 미리 읽을 수 있습니다.

효율성을 높이려면 BufferedReader에서 InputStreamReader를 래핑하는 것이 좋습니다. 예를 들어 :

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

옵션 1. 옵션 2보다 짧은 그리고 정확히 같은 일을하고, 옵션 3은 좋은 선택이 아니다로 이동합니다.