关闭

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

446人阅读 评论(0) 收藏 举报
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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:320165次
    • 积分:3919
    • 等级:
    • 排名:第8112名
    • 原创:129篇
    • 转载:0篇
    • 译文:1篇
    • 评论:154条
    最新评论