2014-04-16 41 views
0

我試圖使用FileChannel.transferFrom移動文件的一些內容到開始。FileChannel.transfer從移動文件內容

try (RandomAccessFile rafNew = new RandomAccessFile(_fileName, "rw"); 
     RandomAccessFile rafOld = new RandomAccessFile(_fileName, "r");) 
{ 
     rafOld.seek(pos); 
     rafOld.getChannel().transferTo(0, count, rafNew.getChannel()); 
} catch (IOException e) { 
     throw new RuntimeException(e.getMessage()); 
} 

這樣做的結果是一個具有奇怪數據重複的文件。如果我首先將數據傳輸到緩衝區文件,然後再將緩衝區文件傳輸回原始文件,則該示例有效。

Java文檔沒有提到源和目標是相同文件的情況。

+0

問題不在於此,源和目的地相同,但Java操作在流上不允許在文件頂部附加內容。 [鏈接](http://stackoverflow.com/questions/6127648/writing-in-the-beginning-of-a-text-file-java) – dpolaczanski

+0

@dpolaczanski這裏沒有流,你的鏈接沒有說你聲稱它說什麼。 – EJP

+0

FileChannel類的JavaDoc實際上表示字節可以從文件傳輸到某個_other_通道,反之亦然。 –

回答

0

您正在將'count'個字節從'rafOld'開始從轉移到'rafNew',它沒有對它進行任何搜索,所以也位於零位。所以最好你的代碼不會做你說的那樣。您在'rafOld'上執行的seek()不會影響transferTo()操作。你應該已經刪除它並寫入

transferTo(pos, count, rafNew.getChannel()); 

但是,這仍然有兩個問題。

  1. 如果計數> pos您將覆蓋源區域。

  2. transferTo()必須在循環中調用,因爲它不保證在單次調用中競爭整個傳輸。它返回實際傳輸的字節數,

+0

爲什麼覆蓋源區域是一個問題。如果您正在寫入的區域不再使用,這應該不成問題。我的意思是,目標前進的越多,源代碼越多,因此它們不會重疊。 –

+0

這是一個問題,如果它是無意的。 – EJP