簡體   English   中英

RandomAccessFile和讀/寫開始完成位置

[英]RandomAccessFile and read/write start-finish position

我已經搜索了很多,但仍然找不到...所以希望您能幫助我理解:)

問題是...

我有大文件A.dat,我想要

  • A)用RandomAccessFile讀取它(以避免OutOfMemory錯誤)
  • B)讀取4Mb片段(緩沖區)
  • C)將每個4Mb片段寫入文件B.dat
  • D)因此,將文件B.dat復制為文件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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM