【发布时间】:2013-10-21 08:40:43
【问题描述】:
我正在尝试将文件的一部分从文件通道复制到另一个(写入一个新文件,实际上等于第一个文件)。
所以,我正在读取 256kb 的块,然后将它们放回另一个频道
static void openfile(String str) throws FileNotFoundException, IOException {
int size=262144;
FileInputStream fis = new FileInputStream(str);
FileChannel fc = fis.getChannel();
byte[] barray = new byte[size];
ByteBuffer bb = ByteBuffer.wrap(barray);
FileOutputStream fos = new FileOutputStream(str+"2" /**/);
FileChannel fo = fos.getChannel();
StringBuilder sb;
while (fc.read(bb) != -1) {
fo.write(bb /**/);
bb.clear();
}
}
问题是 fo.write(我认为)从通道的开头再次写入,因此新文件仅由最后读取的块组成。
我尝试使用fo.write (bb, bb.position()),但它没有按我的预期工作(指针是否返回到通道的开头?)并且FileOutputStream(str+"2", true) 认为它会附加到新文件的末尾,但它没有。
我需要处理 256kb 的块,所以我不能对程序的结构进行太多更改(除非我做错了什么)
通过bb.flip();解决
while (fi.read(bb) != -1) {
bb.flip();
fo.write(bb);
bb.clear();
}
【问题讨论】:
-
为什么必须使用 FileChannel?也许是这样:stackoverflow.com/questions/2520305/… 是您要找的东西?
-
因为这篇文章我找到了。 nadeausoftware.com/articles/2008/02/…我现在正在检查那个。
-
第一篇文章的问题是它传输所有内容而不是块。现在检查 RC 的解决方案
-
看来我不得不使用 bb.flip();如果你写它我会接受答案