Java 如果使用FileChannel调用,transferFrom和transferTo是否传输所有字节?
一些互联网文档向我展示了如下示例:Java 如果使用FileChannel调用,transferFrom和transferTo是否传输所有字节?,java,nio,filechannel,Java,Nio,Filechannel,一些互联网文档向我展示了如下示例: FileChannel目标; 文件通道源; target.trasferFrom(source,0,source.size());//完成! 或 FileChannel源代码; 文件通道目标; source.transferTo(0,source.size(),target);//完成! 但该文件说,这些方法实际上可以传输比给定的更少的数据 如果源或目标是文件通道的一个实例,则是否将从转移到,转移到所有给定计数 我不该这样绕圈子吗 for(长计数=文件.s
FileChannel目标;
文件通道源;
target.trasferFrom(source,0,source.size());//完成!
或
FileChannel源代码;
文件通道目标;
source.transferTo(0,source.size(),target);//完成!
但该文件说,这些方法实际上可以传输比给定的更少的数据
如果源
或目标
是文件通道
的一个实例,则是否将从
转移到,转移到所有给定计数
我不该这样绕圈子吗
for(长计数=文件.size(源);计数>0L;){
最终长传输=可读。传输到(
可读。位置(),计数,可写);
readable.position(readable.position()+已传输);
计数-=已转移;
}
对于(长计数=文件。大小(源);计数>0L;){
最终长传输=可写。传输自(
可读,可写。位置(),计数);
writable.position(writable.position()+已传输);
计数-=已转移;
}
是的,文档是正确的,您必须循环。我没有太多使用通道,我很想使用InputStream进行循环,但Javadoc明确说明了不传输所有请求字节的可能原因:“如果此通道的文件从给定位置开始包含的字节数少于count,或者如果目标通道为非阻塞通道且其输出缓冲区中的可用字节数少于count,则传输的字节数少于请求的字节数。”。因此,如果目标有足够的空闲字节或正在阻塞,似乎可以不使用循环。如果该列表并非详尽无遗,则Javadoc不清楚这一点。@ErwinBolwidt在transferFrom()
的情况下,源不一定是文件,Javadoc不清楚这一点。