2013-02-21 50 views
2

我希望能夠在以後的任何時間打開一個(非常大的)文件並從任意點讀取數據,而不會將整個內容保留在內存中。如何讓文件保持打開狀態以便讀取

這可能嗎?

我想打開一個文件的句柄,沒有別的東西會讀取/寫入這個文件,並且能夠從任何給定的偏移量&長度以後抓取數據,而無需再次在磁盤上搜索文件。

我本以爲會有某種

1, open handle to file 
2, create reader 
3, skip reader to X 
4, read for Y 
5, reset reader to 0 
6, return to step 3 

起初它似乎像BufferedReader.mark將是我後,但該文檔表明,如果我mark, skip, read, reset從我這裏標明的內容,以在哪裏我跳過了,將被保存在內存中?

從文檔,

限制上而仍然保持 標記讀取的字符數。嘗試在讀取 字符之後重置流,直至達到此限制或超出此限制可能會失敗。比輸入緩衝區大小更大的限制值 將導致分配的新緩衝區爲 ,其大小不小於限制。因此應謹慎使用較大的值 。

它說「讀」,所以也許如果我跳過,它不會計入這個限制(這是有道理的),但我可能讀了很多,所以看起來這個新分配的輸入緩衝區可能變得相當大。我不希望這種情況發生...

有沒有更好的方法來解決這個問題?

+0

聽起來你想使用RandomAccessFile。 – 2013-02-21 02:04:30

回答

6

您可能正在尋找RandomAccessFile類。

+0

剛剛發現它,這正是我之後,謝謝 – 2013-02-21 01:54:14

1

另一種選擇

如果您使用的是Java 7,它包括一個新的了ByteChannel,SeekableByteChannel。此頻道保持當前位置,所以您可以從此位置讀取和寫入。這允許隨機訪問位置。

SeekableByteChannel - 甲SeekableByteChannel延伸了ByteChannel和 允許維護和修改到它所連接的底層 實體的當前位置。如果允許的話,它有方法獲取底層實體的大小或將其截斷爲給定的大小。

0

RandomAccessFile.seek(long position)和FileChannel.position(long position)可以設置讀取/寫入數據的文件位置。

相關問題