使用FileChannel高效率拷贝文件

公司维护期有个需求,要将大概2T的文件转移到其他盘

用IO从晚6点拷贝到凌成5点多

若使用NIO,效率高很多

FileChannel的transferTo方法:

/*
	 * @param file_Source 原文件路径
	 * @param file_Target 目标文件路径
	 * @return 返回操作用时时间
	 * 
	 * */
	public static long fileCopy_TransferTo(File file_Source, File file_Target)
			throws Exception {
		long time = new Date().getTime();
		long size_Memory = 20971520;// 每段的内存大小设置20M
		long length = 2097152;
		FileInputStream fileInputStream = new FileInputStream(file_Source);
		FileOutputStream fileOutputStream = new FileOutputStream(file_Target);
		FileChannel fileChannel_fileInputStream = fileInputStream.getChannel();
		FileChannel fileChannel_fileOutputStream = fileOutputStream
				.getChannel();
		while (true) {
			if (fileChannel_fileInputStream.position() == fileChannel_fileInputStream
					.size()) {
				fileChannel_fileInputStream.close();
				fileChannel_fileOutputStream.close();
				return new Date().getTime() - time;
			}
			if ((fileChannel_fileInputStream.size() - fileChannel_fileInputStream
					.position()) < size_Memory)
				length = (fileChannel_fileInputStream.size() - fileChannel_fileInputStream
						.position());
			else
				length = size_Memory;
			fileChannel_fileInputStream.transferTo(
					fileChannel_fileInputStream.position(), length,
					fileChannel_fileOutputStream);
			fileChannel_fileInputStream.position(fileChannel_fileInputStream
					.position() + length);
		}
	}

FileChannel的transferFrom方法:

public static long fileCopy_TransferFrom(File file_Source, File file_Target)
			throws Exception {
		long time = new Date().getTime();
		long size_Memory = 20971520;// 每段的内存大小设置20M
		long length = 2097152;
		FileInputStream fileInputStream = new FileInputStream(file_Source);
		FileOutputStream fileOutputStream = new FileOutputStream(file_Target);
		FileChannel fileChannel_fileInputStream = fileInputStream.getChannel();
		FileChannel fileChannel_fileOutputStream = fileOutputStream
				.getChannel();
		while (true) {
			if (fileChannel_fileOutputStream.position() == fileChannel_fileInputStream
					.size()) {
				fileChannel_fileInputStream.close();
				fileChannel_fileOutputStream.close();
				return new Date().getTime() - time;
			}
			if ((fileChannel_fileInputStream.size() - fileChannel_fileOutputStream
					.position()) < size_Memory)
				length = (fileChannel_fileInputStream.size() - fileChannel_fileOutputStream
						.position());
			else
				length = size_Memory;
			
			fileChannel_fileOutputStream.transferFrom(fileChannel_fileInputStream, fileChannel_fileOutputStream.position(), length);
			fileChannel_fileOutputStream.position(fileChannel_fileOutputStream
					.position() + length);
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值