2011-12-01 2 views
6

이 두 클래스의 차이점과이 두 클래스가 어떻게 작동하는지 이해해야합니다. 필자는 FileReader가 한 번에 한 문자 씩 파일에서 문자를 읽음을 알고 BufferedReader는 많은 양의 데이터를 읽고이를 버퍼에 저장하므로 더 빨라진다는 것을 이해합니다.BufferedReader 생성자는 FileReader를 무엇을 기대합니까?

BufferedReader를 사용하려면 FileReader를 제공해야합니다. FileReader가 파일을 다르게 읽는다면 BufferedReader 클래스는 어떻게 사용합니까? BufferedReader가 FileReader를 사용하므로 문자가 한 번에 한 문자 씩 계속 읽히는 것을 의미합니까? 내 질문에 BufferedReader 클래스를 FileReader 클래스를 사용하는 방법입니다 것 같아요.

+0

작동 방식에 신경 쓰지 않아야합니다. 그것이하고 당신이 너 자신을 생각해 낼 수있는 무엇 이건보다는 능률이 능률이 높다는 것을 아십시오. 그리고 그것이 어떻게 작동 하는지를 고집한다면, 계속해서 소스 코드를 살펴보십시오. –

답변

5

우선, BufferedReaderFileReader이 아니라 Reader이됩니다 (후자는 허용되지만).

Reader 추상 클래스는 여러 개의 read() 메소드를 가지고 있습니다. 문자 하나를 배열로 읽는 두 가지 버전뿐만 아니라 한 문자 읽기 버전이 있습니다.

한 번에 하나의 문자 또는 작은 블록을 읽는 경우에만 BufferedReader을 사용하는 것이 좋습니다.

는 다음과 같은 두 가지 요청을 고려해 두 번째는 대부분의 아마 BufferedReader의 내부 버퍼에서 만족하실 것입니다 반면

char ch1 = fileReader.read(); 
char ch2 = bufferedReader.read() 

첫 번째는, 기본 파일로 이동합니다.

2

FileReader는 한 번에 1 문자 만 읽을 수있는 청크를 읽을 수 있습니다. 전달하는 char [] 배열의 크기까지 읽을 수 있도록 Reader에서 read (char []) 메서드를 상속합니다. BufferedReader는 BufferedReader에서 read() 메서드를 호출 할 때 단순히 FileReader를 래핑하기 만하면됩니다. 내부적으로 버퍼를 처리하고 기본 Reader에서 read() 메서드를 호출합니다. BufferedReader를 사용하는 주된 이유 중 하나는 readLine() 메서드를 사용할 수 있기 때문입니다. BufferedReader는 FileReader (InputStreamReader 등) 이외의 다른 Reader를 랩 할 수 있습니다.

+0

FileReader를 '감싸는'BufferedReader 개념은 중요한 개념입니다. 마지막 줄에서 언급했듯이 BufferedReader는 InputStreamReader **와 같은 다른 유형의 판독기를 래핑 할 수도 있고 ** 또한 자체적으로 래핑 될 수 있습니다. 이것을 [장식 패턴] (http : //en.wikipedia.org/wiki/Decorator_pattern) 추가 기능/동작을 객체에 동적으로 추가 할 수 있습니다. – phuibers

6

BufferedReader는 FileReader.read(char[] cbuf, int off, int len) 메서드를 사용하며, 한 번에 두 개 이상의 문자를 가져 오려는 경우 읽을 수도 있습니다.

BufferedReader를 사용하면 원하는 크기로 읽고 더 효율적으로 읽을 수 있습니다. 항상 큰 블록을 읽는다면 BufferedReader를 삭제하는 것이 약간 더 효율적일 수 있습니다.

2

BufferedReader는 임의의 판독기 위에 버퍼링 계층을 추가합니다. 요점은 버퍼링되지 않은 방식으로 파일, 소켓 또는 무언가를 읽는 것과 비교하여 더 읽기를 최적화하는 것입니다. 또한 청크를 프리 페치하지 않으면 잘 작동하지 않는 몇 가지 편리한 방법을 추가합니다. FileReader의 경우 BufferedReader.readLine()과 같은 작업을 수행 할 수 있도록 '\ n'을 찾을 때까지 데이터 덩어리를 읽어야하며 다음 읽기 작업을 위해 나머지 데이터를 유지해야합니다 (느린 데이터 소스가 모든 것을 사용자에게 제공 할 때까지 기다려야하는 경우 필요한 작업은 말할 것도 없습니다).