[java] 버퍼링 된 RandomAccessFile 자바


1 Answers

RandomAccessFile에서 BufferedInputStream을 다음과 같은 코드로 만들 수 있습니다.

 RandomAccessFile raf = ...
 FileInputStream fis = new FileInputStream(raf.getFD());
 BufferedInputStream bis = new BufferedInputStream(fis);

몇 가지 유의 사항

  1. FileInputStream을 닫으면 RandomAccessFile이 닫히고 그 반대의 경우도 마찬가지입니다.
  2. RandomAccessFile과 FileInputStream은 같은 위치를 가리키고 있으므로 FileInputStream을 읽으면 RandomAccessFile에 대한 파일 포인터가 앞으로 이동하고 그 반대의 경우도 마찬가지입니다.

아마 당신이 이것을 사용하길 원하는 방식 일 겁니다.

RandomAccessFile raf = ...
FileInputStream fis = new FileInputStream(raf.getFD());
BufferedInputStream bis = new BufferedInputStream(fis);

//do some reads with buffer
bis.read(...);
bis.read(...);

//seek to a a different section of the file, so discard the previous buffer
raf.seek(...);
bis = new BufferedInputStream(fis);
bis.read(...);
bis.read(...);
Question

RandomAccessFile은 파일에 무작위로 액세스하는 경우 매우 느립니다. 그 위에 버퍼링 된 레이어를 구현하는 방법에 대해 자주 읽지 만,이를 수행하는 코드는 온라인에서 찾을 수 없습니다.

그래서 내 질문은 : 당신이 누군지이 클래스의 모든 opensource 구현을 알고 포인터를 공유하거나 자신의 구현을 공유?

이 질문이이 문제에 대한 유용한 링크와 코드의 모음으로 밝혀지면 좋을 것입니다. 물론이 문제는 많은 사람들이 공유하고 있으며 SUN이 제대로 해결하지 못했습니다.

파일이 Integer.MAX_VALUE보다 크게 될 수 있으므로 MemoryMapping에 대한 참조가 없습니다.




64 비트 컴퓨터에서 실행중인 경우 메모리 매핑 파일이 가장 좋은 방법입니다. 단순히 전체 파일을 동일한 크기의 버퍼 배열로 매핑 한 다음 필요에 따라 각 레코드에 대한 버퍼를 선택하십시오 (예 : edalorzo 의 대답, 경계를 넘는 레코드가 없도록 겹치는 버퍼가 필요함 ).

32 비트 JVM에서 실행중인 경우에는 RandomAccessFile 을 사용해야합니다. 그러나 전체 레코드가 들어있는 byte[] 를 읽은 다음 ByteBuffer 를 사용하여 해당 배열에서 개별 값을 검색 할 수 있습니다. 최악의 경우, 레코드의 위치 / 크기를 검색하는 레코드와 레코드 자체를 검색하는 레코드의 두 가지 액세스를 만들어야합니다.

그러나 byte[] 많이 만들면 가비지 수집기에 스트레스를주기 시작할 수 있으며 파일 전체를 튀어 오르게하면 IO 바인딩 상태가 유지됩니다.



Related