2008-11-04 2 views
24

현재 동일한 텍스트 파일에 초기화 된 BufferedReader 2 개가 있습니다. 처음으로 BufferedReader으로 텍스트 파일을 읽었을 때, 두 번째 파일을 사용하여 맨 위에있는 파일을 다른 패스로 넘깁니다. 동일한 파일을 여러 번 통과해야합니다.Java BufferedReader가 텍스트 파일의 맨 위로 돌아갑니다?

나는 약 reset()에 대해 알고 있지만, 파일의 크기를 알아야 할 때 mark()mark()을 호출해야하기 때문에, 나는 귀찮게해야한다고 생각하지 않는다.

아이디어가 있으십니까? 패키지? Libs? 암호?

감사 TJ

답변

24

바로 위에서 읽어 내기위한, 새로운 BufferedReader을 만드는의 단점은 무엇입니까? 충분히 작 으면 운영 체제가 파일을 캐시 할 것으로 기대합니다.

성능이 걱정된다면 병목 현상이 있음을 입증 했습니까? 나는 가장 단순한 일을하고 당신이 특별한 이유가있을 때까지 그것에 대해 걱정하지 않을 것입니다. 내 말은, 당신은 모든 것을 메모리에 읽어 들인 다음 결과에 대한 두 가지 패스를 할 수 있지만 다시 한번 새로운 리더로 처음부터 다시 읽는 것보다 더 복잡 할 것입니다.

27

버퍼 된 판독기는 파일을 순차적으로 읽는 것을 의미합니다. 당신이 찾고있는 것은 java.io.RandomAccessFile이며, seek()을 사용하면 파일에서 원하는 위치로 이동할 수 있습니다.

랜덤 액세스 리더

그래서 다음과 같이 구현된다 :

"rw"
try{ 
    String fileName = "c:/myraffile.txt"; 
    File file = new File(fileName); 
    RandomAccessFile raf = new RandomAccessFile(file, "rw"); 
    raf.readChar(); 
    raf.seek(0); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

detailed here 인 모드 특성이다.

순차 액세스 판독기가 이와 같이 설정되는 이유는 버퍼를 구현할 수 있고 발밑에서 내용을 변경할 수 없기 때문입니다. 예를 들어, 버퍼링 된 판독기에 제공된 파일 판독기는 해당 버퍼 판독기에서만 작동해야합니다. 하나의 리더가 파일 리더에서 자신의 위치를 ​​전진시키면서 다른 리더가 다른 리더를 사용하기를 원했을 때 일관성없는 작업을 수행 할 수있는 다른 위치가 있고 그 위치가 미확인 위치에있을 수 있습니다.

3

두 번째 패스가 필요없는 방식으로 알고리즘을 변경하는 것이 가장 좋은 방법입니다. 이 접근 방식은 사용 가능한 메모리에 맞지 않는 거대한 (그러나 끔찍한, 즉 몇 GBs가 아닌) 파일을 다루어야 할 때 몇 번 사용되었습니다.

그것은 어려울 수 있지만 성능 향상은 보통 노력을

+0

더 자세히 설명해 주시겠습니까? 30MB의 파일이 있는데 메모리에 모두로드 할 수 없습니다. 필자는 데이터를 정렬했으며 파일에서 직접 이진 검색을 수행하려고합니다. 이를 위해 무작위로 찾아야합니다. –

+0

어쨌든, 디스크에서 무작위로 탐색하면 종종 이진 검색의 로그 성능을 완전히 망칠 수 있습니다. 어쨌든, 디스크에서 무작위로 검색하면 종종 이진 검색의 로그 성능이 손상됩니다. 몇 가지 대안은 1) 순차적 액세스 (예, 디스크에서 순차 검색은 2 진 검색보다 빠를 수 있음) 또는 2) B-tree http://en.wikipedia.org/wiki/와 같은 혼합 된 접근 방식입니다. B 트리 이러한 힌트가 충분하지 않은 경우 질문 대신 별도의 질문으로 게시 할 수 있습니다 (제발 ping에 대한 질문의 링크와 함께 여기에 의견을 게시하십시오) – Davide

-1

worths "표시 (대한 전체 사업)과의 BufferedReader 가난한 디자인 난다에서) (재설정."

왜이 클래스를 확장하고 생성자()에서 mark()를 수행 한 다음 topOfFile() 메소드에서 seek (0)을 수행하지 않는지 확인하십시오.

BR,
~ 마크에 대한

1

은/리셋 :

의 BufferedReader의 표시 방법은 리셋이 불가능하게하기 전에 마크 후에 읽을 수있는 방법까지 제한하는 readAheadLimit 매개 변수를합니다.재설정은 실제로 파일 시스템 seek (0)을 의미하는 것이 아니라 버퍼 내부를 탐색합니다. Javadoc의 인용문 :

readAheadLimit - 마크를 보존하면서 읽을 수있는 문자 수 제한. 이 문자를 읽은 후 스트림을 재설정하려고 시도하면 실패 할 수 있습니다. 한계 값이 입력 버퍼의 크기보다 크면 크기가 한계보다 작지 않은 새 버퍼가 할당됩니다. 따라서 큰 값은 신중히 사용해야합니다.

관련 문제