如何使用FileChannel将一个文件的内容附加到另一个文件的末尾?

时间:2013-11-21 20:24:46

标签: java

档案a.txt如下:

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 个答案:

答案 0 :(得分:12)

这是旧的,但由于您打开文件输出流的模式而发生覆盖。 对于任何需要此功能的人,请尝试

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 :(得分:5)

将目的地通道的位置移至末尾:

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

答案 2 :(得分: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在这里不起作用?