如何獲得給定範圍內的文件字節?文件可能非常大,因此將所有字節保存在內存中不是個好主意。我可以逐字節讀取文件嗎?閱讀是否正常?如何獲得給定範圍內的文件字節?
1
A
回答
1
我同意@Berger,你可以在java中使用RandomAccessFile。你可以使用下面的代碼來隨機讀取文件。
RandomAccessFile f = new RandomAccessFile("FilePath","r");
byte[] buffer = new byte[1024];
f.read(buffer, 10, 100);
下面是read()方法從Java的doc-文檔
/**
* Reads up to <code>len</code> bytes of data from this file into an
* array of bytes. This method blocks until at least one byte of input
* is available.
* <p>
* Although <code>RandomAccessFile</code> is not a subclass of
* <code>InputStream</code>, this method behaves in exactly the
* same way as the {@link InputStream#read(byte[], int, int)} method of
* <code>InputStream</code>.
*
* @param b the buffer into which the data is read.
* @param off the start offset in array <code>b</code>
* at which the data is written.
* @param len the maximum number of bytes read.
* @return the total number of bytes read into the buffer, or
* <code>-1</code> if there is no more data because the end of
* the file has been reached.
* @exception IOException If the first byte cannot be read for any reason
* other than end of file, or if the random access file has been closed, or if
* some other I/O error occurs.
* @exception NullPointerException If <code>b</code> is <code>null</code>.
* @exception IndexOutOfBoundsException If <code>off</code> is negative,
* <code>len</code> is negative, or <code>len</code> is greater than
* <code>b.length - off</code>
*/
public int read(byte b[], int off, int len) throws IOException {
return readBytes(b, off, len);
}
0
一般來說是很少到整個文件加載到內存中是一個好主意,除非你知道它總會足夠小以適應您的記憶,並且您不會同時加載多個文件,否則您可能會面臨OOME
。
如果您想要讀取文件,您確實可以通過方法read()來逐字節讀取,但實際上它用於需要讀取少量字節的非常特定的用例,因爲它不是一種優化方式閱讀整個文件。
在這種情況下公共代碼是:
int data;
while ((data = input.read()) != -1) {
// Do something with data
}
如果你想閱讀您的文件更快,你應該使用的方法read(byte[] b),它允許重用以前由主叫用戶代碼中創建一個字節數組和閱讀像你想要做的一樣的字節範圍。
在這種情況下公共代碼是:
int length;
byte[] data = new byte[someSizeHere];
while ((length = input.read(data)) != -1) {
// Do something with the bytes in data between index 0 and length - 1
}
如果你想在開始讀你的字節範圍之前要跳過一些字節,你的確可以使用RandomAccessFile
及其方法seek(long)
0
打開文件使用RandomAccessFile
,尋找開始偏移量,定義緩衝區長度並完全讀取緩衝區。 try-with-resources
聲明負責關閉RandomAccessFile
。
public static byte[] readByteRange(String sourceFilePath, long startingOffset, int length) throws IOException
{
try (RandomAccessFile randomAccessFile = new RandomAccessFile(sourceFilePath, "r"))
{
byte[] buffer = new byte[length];
randomAccessFile.seek(startingOffset);
randomAccessFile.readFully(buffer);
return buffer;
}
}
相關問題
- 1. 如何從給定的範圍中獲得給定範圍的數字R
- 2. 給定一串數字範圍,獲得這些範圍內的所有數字?
- 3. 如何獲得LBA範圍,給定一個文件?
- 4. 如何獲得dom範圍內的所有文本節點?
- 5. 獲得一定範圍內
- 6. 如何獲得範圍內數字的否定因素?
- 7. 如何生成給定範圍內的迴文數字列表?
- 8. 如何獲得範圍內的值範圍
- 9. 查找給定範圍內的數字?
- 10. 在隨機字節的給定範圍內生成隨機數
- 11. 在給定的年份範圍內獲得年度計數
- 12. 如何獲得一個月範圍內指定日期的範圍
- 13. 如何獲取給定日期範圍內的天數?
- 14. 如何獲取給定日期範圍內的日期列表?
- 15. 文件中的字節輸入範圍
- 16. 如何使用window.crypto.getRandomValues獲得特定範圍內的隨機值
- 17. 如何獲得在特定範圍內的值時間戳
- 18. 我如何獲得指定範圍內的隨機double?
- 19. 如何獲取varbinary數據中特定範圍的字節?
- 20. 如何計算給定數字範圍內的某些點
- 21. 確定給定範圍內的素數
- 22. FFmpeg在一定範圍內的文字
- 23. 獲取日期範圍內的季節
- 24. img2pdf如何給文件範圍
- 25. 打印給定範圍內的所有迴文數字
- 26. Apache字節範圍和音頻文件
- 27. 如何檢查數字是否在給定範圍內?
- 28. 如何獲得郵件在日期範圍內?
- 29. 全球範圍內VS文件範圍
- 30. 如何獲得特定範圍內的幾個後代的html內容?
查看'RandomAccessFile'。 – Berger
@NicolasFilotto,二進制 – Tony