使用通道和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);


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvshaorong/article/details/49951899
上一篇使用javaassist在内存中动态生成类
下一篇MySQL存储过程的简单用法
想对作者说点什么? 我来说一句

CSocket进行文件传输

2010年05月18日 189KB 下载

没有更多推荐了,返回首页

关闭
关闭