使用通道和byteBuffer进行大文件分批传输

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;

public class AdvancedCopy {

	public void advancedCopy(File sourse,File target) throws IOException{
		long fileSize = sourse.length();
		int bufferLength = 1024*1024*2;//每次传输2m
		int times = (int) (fileSize/bufferLength);//用于计算最后一次还剩多少,并限定for的次数
		int remain = (int) (fileSize - times*bufferLength);
		
		FileInputStream fileInputStream = new FileInputStream(sourse);
		FileChannel fileChannel = fileInputStream.getChannel();//从输入流获得通道
		ByteBuffer byteBuffer = null;//字节缓冲区
		
		FileOutputStream fileOutputStream = new FileOutputStream(target);
		FileChannel fileChannel2 = fileOutputStream.getChannel();//从输出流获得通道
		int i = 0;//记录第几次传输
				for (; i < times; i++) {//i是第几次传输
					byteBuffer = fileChannel.map(MapMode.READ_ONLY, i*bufferLength, bufferLength);//读取指定长度的字节到内存中的bytebuffer中,第二个参数是起始字节,第三个参数是读写数量
					fileChannel2.write(byteBuffer);
					System.out.println("正在进行"+i+"/"+times);
				}
				byteBuffer = fileChannel.map(MapMode.READ_ONLY, i*bufferLength, remain);//最后一次读写
				System.out.println("传输完成");
		
		
	}

}


调用方法

File sourse = new File("E:/Edius6dot02-cr.zip");
File target = new File("i:/Edius6dot02-cr.zip");
new AdvancedCopy().advancedCopy(sourse, target);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值