档案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)
感谢任何想法。
答案 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在这里不起作用?