[英]RandomAccessFile and read/write start-finish position
我已經搜索了很多,但仍然找不到...所以希望您能幫助我理解:)
問題是...
我有大文件A.dat,我想要
但是我有一個問題...如果我有一個文件長度不能由4Mb划分,則數據會丟失並且文件會損壞:(
例如...我有媒體文件。 它的長度是15.8Mb,所以我只能得到15.8Mb / 4Mb = 3整塊。 然后我只能寫那3個字節的片段,其余的會丟失:(或問題是如果文件小於緩沖區大小(4Mb)...
我認為這不應該是一項艱巨的任務,但我看不到任何標准的教程來展示如何解決這類問題...
我非常希望您能在這個問題上幫助我。
在這種情況下, RandomAccessFile
似乎沒有用。 最好使用傳統的基於流的I / O,除非您做錯了,否則肯定不會導致內存不足錯誤。 這實際上是您需要的所有代碼(未經測試):
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream("a.dat");
out = new FileInputStream("b.dat");
byte[] buffer = new byte[4*1024*1042]; //4 MiB
for ( int len = 0; (len = in.read(buffer)) != -1; ) {
out.write(buffer, 0, len);
}
} finally {
if ( in != null )
try { in.close() } catch (IOException ignore) {}
if ( out != null )
try { out.close() } catch (IOException ignore) {}
}
如果由於某種原因您確實需要一個RandomAccessFile
,但您不能告訴我們,則方法本質上是相同的。 使用RandomAccessFile.read(byte[], int, int)
的結果,找出實際讀入緩沖區的數據量RandomAccessFile.read(byte[], int, int)
並使用該數字來限制寫回輸出文件的量。
上面有一些解釋。 以下是關鍵部分:
byte[] buffer = new byte[4*1024*1042]; //4 MiB
這將初始化一個4二進制兆字節的字節數組,該字節數組一次將保存一個文件塊。
for ( int len = 0;
在for循環中,我們首先聲明一個值len
,該值將記錄我們已讀入的字節數。
(len = in.read(buffer)) != -1;
然后,我們在InputStream
上調用read
。 這會將字節讀取到字節數組中,直到緩沖區已滿或沒有更多數據可讀取(到達文件末尾)為止。 該方法返回實際讀取的字節數,並將其分配給len
。 如果該值為-1,則表示流已關閉,因此我們退出循環。
) {
out.write(buffer, 0, len);
}
然后,對於已讀取的每個塊,將其寫入輸出流。 buffer
表示我們要從字節數組中寫入, 0
表示我們要從數組的開頭開始, len
表示要寫入多少字節。 請記住,如果未填充緩沖區,則將相應地設置len
,並且僅寫入數組的一部分。
我給了你慣用的版本,可能很難理解。 這是做同一件事的更直接的方法:
int numberOfBytesRead;
while ( true ) {
numberOfBytesRead = in.read(buffer); //read bytes into buffer
if ( numberOfBytesRead == -1 ) break; //end of stream
out.write(buffer, 0, numberOfBytesRead); //write the same # of bytes we read
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.