以前用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. AIDL实例

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5658372.html 什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进 ...

  2. localtime()方法的疑惑

    在做一个时间管理的APP中遇到一些问题 windows linux mac下time.h中都有关于localtime()的定义. 它不是一个保险可靠的方法,使用的时候需要小心. 参考 http://b ...

  3. Android实例-闪光灯的控制(XE8+小米2)

    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Var ...

  4. Everything

    Everything,windows下做好用的搜索工具,速度特别快!下载地址:http://www.voidtools.com/ 快速下载地址:http://files.cnblogs.com/fil ...

  5. 【WIN32进阶之路】:内存映射文件

    第一章:源起  遇到一个问题,如果一个客户数据文件有2g大,客户要通过界面查询文件中的数据并用列表控件显示数据,要怎么处理这个文件才能让应用程序不会长时间无响应,客户感觉不到程序的卡顿? 第二章:解决 ...

  6. mac ssh会话复制

    第一次登录服务器,需要输入账户.密码, 如果你需要重新开启另一个终端窗口,再次登录此服务器不需要输入账户.密码(类似免登).你只要让本地保存你的SSH会话即可. Mac 保持会话,需要在修改 ssh配 ...

  7. android飞机游戏敌机移动路径

    基础android的飞机类游戏,与前人一样,由surfaceView绘制游戏画面,另起线程控制绘制时间间隔达到动态效果.这里附上最近自己写的敌机自动飞行路径代码.请大家给点意见. 在敌机管理模块,加入 ...

  8. iOS 根据文件名获取到文件路径

    根据文件名来获取文件路径(Document目录下) //根据文件名来获取文件路径 - (NSString *)dataFilePath:(NSString *)sender { NSArray *pa ...

  9. 数据库升级ora-04063 DBMS_REGISTRY has error

    在做Oracle数据库从11.2.0.1.0升级到11.2.0.2.8时,软件升级没有问题,实例升级没有问题,升级psu的时候. 执行@?/rdbms/admin/catbundle psu appl ...

  10. careercup-中等难题

    17.1 编写一个函数,不用临时变量,直接交换两函数. 解法: 方法一:这个是经典面试题,也相当直接.我们将用a0表示a的初值,b0表示b的初始值,用diff表示a0-b0的值. 让我们将a>b ...