2012-08-08 43 views
1

我需要在2個接口之間實現一個包裝,我不能做任何改變。基本上,包裝器需要將Java風格的流式文件訪問轉換爲標準的C風格fopen/fread/fwrite/file訪問(用java實現)。包裝必須實現調用者所需的隨機文件訪問方法,這意味着open/read/write/close/seek/flush/size/truncate;包裝器必須調用一組標準的java文件流方法來提供調用者,被調用者提供輸入流和輸出隊列。Java,將文件流轉換爲隨機訪問文件

我看到java.io.RandomAccessFile,它將C風格轉換爲java風格,我需要顛倒過來。最難的部分是seek()。有沒有什麼好的(有效的)方式來做到這一點。

+1

您可以在整個數據流傳輸到內存緩衝區('ByteArrayOutputStream'會自動增長;'toByteArray'將返回底層的'byte []'),然後你可以對其進行隨機訪問......但這是一個駭人聽聞的解決方案。 – oldrinb 2012-08-08 16:53:27

+0

這個鏈接可以幫助你。 [http://www.coderanch.com/t/277378/Streams/java/InputStream-RandomAccessFile-best-way](http://www.coderanch.com/t/277378/Streams/java/InputStream-RandomAccessFile-最好的方式) – 2012-08-08 16:50:10

+0

Pramod給了我第一個非常有用的評論。 Pramod,你會創建一個答案而不是評論,以便我可以給你信用?謝謝。 – brewphone 2012-08-10 14:59:15

回答

0

去流隨機存取的唯一途徑是緩衝它在內存中(或磁盤上的一個副本)

我建議要麼

  • 它讀入一個ByteArrayOutputStream,並把它到byte[]
  • 將流複製到臨時文件(最好是tmpfs或ram驅動器),然後在其上使用RandomAccessFile。
+1

讀入字節數組就像 byte [] org.apache.commons.io.FileUtils.readFileToByteArray(File file)...一樣簡單,但是當文件大小超過可用內存時,這將不起作用。您可以輕鬆地將RandomAccessFile轉換爲「Channels.newInputStream(randomAccessFile.getChannel())」;「...我將在單獨的答案中詳細說明。 – 2015-01-29 19:11:16

-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());