2012-08-08 4 views
1

2 개의 인터페이스 사이에 래퍼를 구현해야하는데 변경할 수 없습니다. 기본적으로 래퍼는 자바 스타일의 스트리밍 파일 접근을 표준 C 스타일의 fopen/fread/fwrite/file 접근 (자바로 구현)으로 변환해야한다.Java, 파일 스트림을 랜덤 액세스 파일로 변환

래퍼는 호출자가 필요로하는 임의 파일 액세스 방법을 구현해야합니다. 즉, 열기/읽기/쓰기/닫기/찾기/플러시/크기/잘라 내기를 의미합니다. 래퍼는 호출자에게 피드하기 위해 표준 자바 파일 스트리밍 메소드 세트를 호출해야하고, 호출 수신자는 입력 스트림 및 출력 스트림을 제공합니다.

java.io.RandomAccessFile을 보았습니다. C 스타일을 Java 스트림 스타일로 변환했는데, 뭔가 뒤집혀야합니다. 가장 어려운 부분은 seek()입니다. 거기에 좋은 (효율적인) 방법이 있습니까.

+1

당신은 메모리 버퍼에 전체 스트림 데이터를 전송할 수있는 ... [채널 유틸리티 클래스를 사용하여 쉽게 달성 할 수있다 ('ByteArrayOutputStream'가 자동으로 성장할 것이다'toByteArray' 반환합니다 기본'byte []') 다음에 무작위 접근을 할 수있다. 그러나 이것은 해킹 된 해결책이다. – oldrinb

+0

이 링크는 도움을 줄 수 있습니다. [http://www.coderanch.com/t/277378/Streams/java/InputStream-RandomAccessFile-best-way](http://www.coderanch.com/t/277378/Streams/java/InputStream-RandomAccessFile- 최선의 방법) –

+0

Pramod는 나에게 매우 유용한 첫 번째 코멘트를주었습니다. Pramod, 내가 대답 할 수 있도록 답장을 대신 작성 하시겠습니까? 감사. – brewphone

답변

0

스트림에 랜덤 액세스를 얻을 수있는 유일한 방법은 (또는 디스크에 복사본으로)

가 내가있는 ByteArrayOutputStream에 그것을 읽고 돌려 중 하나

  • 을 제안 메모리에 버퍼하는 것입니다 byte[]
  • 스트림을 임시 파일 (tmpfs 또는 RAM 드라이브가 바람직 함)에 복사 한 다음 RandomAccessFile을 사용하십시오.
+1

바이트 배열로 읽어들이는 것은 byte [] org.apache.commons.io.FileUtils.readFileToByteArray (파일 파일)만큼 쉽습니다 ... 그러나 파일 크기가 사용 가능한 메모리를 초과하면이 작업은 작동하지 않습니다. "Channels.newInputStream (randomAccessFile.getChannel());"을 사용하여 쉽게 RandomAccessFile을 스트림으로 변환 할 수 있습니다. "... 나는 별도의 답변으로 자세하게 설명 할 것입니다. –

-2

// STEP 1: Create random access file read-only 
RandomAccessFile raf = new RandomAccessFile("/text.txt", "r"); 

// STEP 2: Use Channels to convert to InputStream 
InputStream is = Channels.newInputStream(raf.getChannel());