windows系统java.nio.channels.FileChannel#transferTo传输文件的问题

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, fileChannel.size(), 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值