1.问题描述
最近在写程序的时候有一个需求,将文件通过网络进行传输,考虑到性能,最终选用FileChannel#transferTo进行传输,最初的代码如下:
fileChannel.transferTo(0,fileChannel.size(),socketChannel);
结果文件比较大的时候(比如说十几M),总是传输不完整;经查阅资料,原来大文件传输的时候,windows对一次传输的大小是有限制的;
2.解决方案
通过transferTo返回的实际传输大小进行多次传输即可;
long position = 0;
long size = fileChannel.size();
long total = 0;
long startTime = System.currentTimeMillis();
while (position < size) {
long transfer = fileChannel.transferTo(position,socketChannel);
System.out.println("发送:" + transfer);
if (transfer <= 0) {
break;
}
total += transfer;
position += transfer;
}
3.总结
不管是windows系统还是linux系统,使用fileChannel.transferTo传输文件,正确的做法就是要根据transferTo返回的实际传输字节数进行多次传输;
参考:
FileChannel.transferTo for large file in windows
FileChannel.transferTo() doesn’t work if address space runs out