以前用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的更多相关文章

  1. Java中创建操作文件和文件夹的工具类

    Java中创建操作文件和文件夹的工具类 FileUtils.java import java.io.BufferedInputStream; import java.io.BufferedOutput ...

  2. C#和Java中执行SQL文件脚本的代码(非常有用)

    原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...

  3. java中读取特殊文件的类型

    java中读取特殊文件的类型: 第一种方法(字符拼接读取): public static String getType(String s){ String s1=s.substring(s.index ...

  4. 【练习】Java中的读文件,文件的创建,写文件

    前言 大家好,给大家带来Java中的读文件,文件的创建,写文件的概述,希望你们喜欢 读文件 public static void read(String path,String filename){ ...

  5. java 中获得 资源文件方法

    1 java 中获取资源文件的方法 项目目录如下 获取当前项目的目录路径 方法一:使用类名 MergeDocHandler.class.getClassLoader().getResource(&qu ...

  6. Java中的读文件,文件的创建,写文件

    前言 大家好,我是 Vic,今天给大家带来Java中的读文件,文件的创建,写文件的概述,希望你们喜欢 示意图 读文件 public static void read(String path,Strin ...

  7. Java Io 之拷贝文件性能比较

    前面我们共讨论了拷贝文件有三种方式: 1. 第一种,一个字节一个字节的进行拷贝文件操作. 2. 第二种,使用字节数据批量的进行拷贝文件操作. 3. 第三种,使用带缓冲输入输出流来拷贝文件. 那么哪一种 ...

  8. java中调用dll文件的两种方法

    一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNativ ...

  9. java中多种写文件方式的效率对比实验

    一.实验背景 最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出.字符流输出.内存文件映射输出.前两种又可以分为 ...

随机推荐

  1. python basic programs

  2. TCP/IP 相关总结

    1.   三次握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等 ...

  3. (莱昂氏unix源代码分析导读-50)LP11行式打印机

    by cszhao1980 LP11有两个设备寄存器:状态寄存器(lpsr)和数据缓冲寄存器(lpbuf),可通过以下结构进行访问: 8812: #define LPADDR 0177514 8823 ...

  4. UVA 10806 Dijkstra, Dijkstra.(费用流)

    n个点的无向带权图,求1->n的最短往返路径,不走重复边. 这里涉及到一个知识点:求无向图上s->t的最短路,其实就是费用流. 而求1->n最短往返路径呢?增加源点s,由s到1加弧, ...

  5. MSSQLSERVER数据库- 作业调度定时备份数据库

    作业调度和备份数据库是常见的行为,掌握这两项技术我觉的非常有必要. 在网上找到这个示例,记录在这里 备份数据库的SQL语句 --自动备份并保存最近5天的SQL数据库作业脚本 ) DECLARE @da ...

  6. Android Handler的简单使用

    大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl ...

  7. IDF实验室-简单编程-字符统计 writeup

    题目地址:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=37 网站:http://ctf.idf.cn/gam ...

  8. UVA 705 Slash Maze

     Slash Maze  By filling a rectangle with slashes (/) and backslashes ( ), you can generate nice litt ...

  9. [置顶] API相关工作的个人总结_工作中琐碎细节的总结二

    续接上篇,今晚又看了看大牛的书,再结合过往工作,总结如下: 1.弃用原理与删除原则做权衡. 2.正确性与易用性的把握. 3.不能因为过度的追求性能提升而违背API的设计原则. 4.兼容性不仅仅是表象的 ...

  10. Ajax防止重复提交

    转:http://www.cnblogs.com/jinguangguo/archive/2013/05/20/3086925.html 谈谈防止重复点击提交   首先说说防止重复点击提交是什么意思. ...