2013-11-21 143 views
6

文件a.txt的樣子:如何使用FileChannel將一個文件的內容追加到另一個文件的末尾?

ABC 

文件d.txt樣子:

DEF 

我試圖採取 「DEF」,並追加到 「ABC」 這樣a.txt看起來

ABC 
DEF 

我試過的方法總是完全覆蓋第一個條目,所以我總是以:

DEF 

這裏有兩種方法我試過:

FileChannel src = new FileInputStream(dFilePath).getChannel(); 
FileChannel dest = new FileOutputStream(aFilePath).getChannel(); 

src.transferTo(dest.size(), src.size(), dest); 

...我已經試過

FileChannel src = new FileInputStream(dFilePath).getChannel(); 
FileChannel dest = new FileOutputStream(aFilePath).getChannel(); 

dest.transferFrom(src, dest.size(), src.size()); 

的API是不清楚這裏的transferTo和transferFrom PARAM描述:

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#transferTo(long,long,java.nio.channels.WritableByteChannel)

感謝您的任何想法。目標通道的

回答

3

移動位置到結束:

FileChannel src = new FileInputStream(dFilePath).getChannel(); 
FileChannel dest = new FileOutputStream(aFilePath).getChannel(); 
dest.position(dest.size()); 
src.transferTo(0, src.size(), dest); 
10

這是舊的,但在覆蓋出現,因爲你打開你的文件輸出流的模式。 對於任何需要,請嘗試

FileChannel src = new FileInputStream(dFilePath).getChannel(); 
FileChannel dest = new FileOutputStream(aFilePath, true).getChannel(); //<---second argument for FileOutputStream 
dest.position(dest.size()); 
src.transferTo(0, src.size(), dest); 
+1

這應該是公認的答案! –

1

純NIO解決方案

FileChannel src = FileChannel.open(Paths.get(srcFilePath), StandardOpenOption.READ); 
FileChannel dest = FileChannel.open(Paths.get(destFilePath), StandardOpenOption.APPEND); // if file may not exist, should plus StandardOpenOption.CREATE 
long bufferSize = 8 * 1024; 
long pos = 0; 
long count; 
long size = src.size(); 
while (pos < size) { 
    count = size - pos > bufferSize ? bufferSize : size - pos; 
    pos += src.transferTo(pos, count, dest); // transferFrom doesn't work 
} 
// do close 
src.close(); 
dest.close(); 

不過,我還有一個問題:爲什麼transferFrom不在這裏工作了?

相關問題