java中的拷贝文件FileChannel
以前用Java拷贝文件,只知道写byte数组循环拷贝,今天知道了可以用FileChannel进行拷贝,上代码:
下边是传统的byte数组拷贝方法
</pre><pre name="code" class="java">private void copyFilefromByte() throws IOException {
		long start = System.currentTimeMillis();
		MemorySee memorySee = new MemorySee();
		memorySee.begin();
		File name = new File("D:\\a\\hehe.zip");
		File n1 = new File("D:\\a\\a.zip");
		FileInputStream fileInputStream = new FileInputStream(name);
		n1.createNewFile();
		FileOutputStream fileOutputStream = new FileOutputStream(n1);
		byte[] bytes = new byte[1024000];
		int length = -1;
		while ((length = fileInputStream.read(bytes, 0, bytes.length)) != -1) {
			fileOutputStream.write(bytes, 0, length);
		}
		fileOutputStream.flush();
		fileOutputStream.close();
		fileInputStream.close();
		memorySee.end();
		memorySee.sayMemoryUse();
		long end = System.currentTimeMillis();
		System.out.println("run time:" + (end - start));
	}
下边是使用FileChannel拷贝文件的方法:
private void copyFileFromCannel() throws IOException {
		long start = System.currentTimeMillis();
		MemorySee memorySee = new MemorySee();
		memorySee.begin();
		File name = new File("D:\\a\\hehe.zip");
		File n1 = new File("D:\\a\\b.zip");
		FileInputStream fileInputStream = new FileInputStream(name);
		FileChannel fileChannel = fileInputStream.getChannel();
		n1.createNewFile();
		FileOutputStream fileOutputStream = new FileOutputStream(n1);
		FileChannel fileChannel2 = fileOutputStream.getChannel();
		int position = -1;
		long fileSize = name.length();
		int writeLength = 0;
		while (true) {
			writeLength += fileChannel2.transferFrom(fileChannel, writeLength,
					fileSize - writeLength);
			System.out.println("writeLength:"+writeLength);
			if (writeLength == fileSize) {
				break;
			}
		}
		fileChannel2.close();
		fileChannel.close();
		memorySee.end();
		memorySee.sayMemoryUse();
		long end = System.currentTimeMillis();
		System.out.println("run time:" + (end - start));
	}
还有一个辅助打印memory的类:
 class MemorySee{
		private long startM =0;
		private long endM =0;
		public void begin(){
			Runtime.getRuntime().gc();
			startM=Runtime.getRuntime().freeMemory();
		}
		public void end(){
			  endM=Runtime.getRuntime().freeMemory();
		}
		public void sayMemoryUse(){
			 System.out.println(startM-endM);
		}
	}
最后输出结果:
使用FileChannel拷贝的时间,要比byte节约大约1/2时间,或者更多,内存占用总比byte少,如果要提高byte的时间,那么就要提高byte的大小,这样就会消耗更多内存,总之,使用FileChannel既快速,又省内存。
版权声明:本文为博主原创文章,未经博主允许不得转载。
java中的拷贝文件FileChannel的更多相关文章
- Java中创建操作文件和文件夹的工具类
		
Java中创建操作文件和文件夹的工具类 FileUtils.java import java.io.BufferedInputStream; import java.io.BufferedOutput ...
 - C#和Java中执行SQL文件脚本的代码(非常有用)
		
原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...
 - java中读取特殊文件的类型
		
java中读取特殊文件的类型: 第一种方法(字符拼接读取): public static String getType(String s){ String s1=s.substring(s.index ...
 - 【练习】Java中的读文件,文件的创建,写文件
		
前言 大家好,给大家带来Java中的读文件,文件的创建,写文件的概述,希望你们喜欢 读文件 public static void read(String path,String filename){ ...
 - java 中获得 资源文件方法
		
1 java 中获取资源文件的方法 项目目录如下 获取当前项目的目录路径 方法一:使用类名 MergeDocHandler.class.getClassLoader().getResource(&qu ...
 - Java中的读文件,文件的创建,写文件
		
前言 大家好,我是 Vic,今天给大家带来Java中的读文件,文件的创建,写文件的概述,希望你们喜欢 示意图 读文件 public static void read(String path,Strin ...
 - Java Io 之拷贝文件性能比较
		
前面我们共讨论了拷贝文件有三种方式: 1. 第一种,一个字节一个字节的进行拷贝文件操作. 2. 第二种,使用字节数据批量的进行拷贝文件操作. 3. 第三种,使用带缓冲输入输出流来拷贝文件. 那么哪一种 ...
 - java中调用dll文件的两种方法
		
一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676 JNativ ...
 - java中多种写文件方式的效率对比实验
		
一.实验背景 最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出.字符流输出.内存文件映射输出.前两种又可以分为 ...
 
随机推荐
- 【Hadoop代码笔记】Hadoop作业提交之JobTracker等相关功能模块初始化
			
一.概要描述 本文重点描述在JobTracker一端接收作业.调度作业等几个模块的初始化工作.想过模块的介绍会在其他文章中比较详细的描述.受理作业提交在下一篇文章中会进行描述. 为了表达的尽可能清晰一 ...
 - 【noip2007】树网的核
			
题解: 首先我们要知道一个性质:如果有多条直径 这个核不论在哪条直径上 答案都是一样的 这样我们就可以随便找一条直径 在这条直径上枚举核的位置 并且dfs预处理maxlon[i] (i在直径上) 表示 ...
 - HDU-4635 Strongly connected 强连通,缩点
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给一个简单有向图(无重边,无自环),要你加最多的边,使得图还是简单有向图... 先判断图是 ...
 - JS 格式化日期
			
function formatDate(date){ var year=date.getFullYear(); var month=date.getMonth()+1; var date=date.g ...
 - android事件分发笔记
			
1.SimpleOnGestureListener 遇到的问题: 自己定义一个按钮继承自Button,一开始改变按钮颜色的操作放在onTouchEvent的ATION_DOWN里触发. 这时问题来了, ...
 - Delphi的移动文件方法(转)/删除文件:/文件的复制
			
RenameFile,DeleteFile,MoveFile Delphi的移动文件方法 uses ShellApi; procedure ShellFileOperation(fromFile: ...
 - Android 开机默认横竖屏
			
做Android系统开发时,经常遇到机器开机默认横竖屏问题,现整理如下: 方法一:修改WindowManagerService.java 在这个类中修改int mRotation = 0;这个值即可. ...
 - ASP.NET MVC- EF基础
			
EF是在ADO.NET的基础上做进一步封装,以后如果做新的项目我可能会考虑不用ADO.NET,而用EF. 其实很久以前我就接触过EF,可是太久没用,有些忘记了,前几天重温,也做了一点笔记.记录如下: ...
 - [一位菜鸟的COCOS-2D编程之路]打飞机中机种敌机和战机损毁时的爆炸效果
			
1.第一步,添加爆炸动画 //添加玩家飞机飞行动画 id _playerFlyAction; id _playerBlowupAnimation; //战机爆炸动画 id _enemyBlowupAn ...
 - Python比较函数__cmp__
			
#!/usr/bin/python class my_type(object): def __init__(self, v): self.value = v def __cmp__(self, v2) ...