以前用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. ACCESS-类型转换函数

    类型转换涵数: 函数   返回类型   expression   参数范围   CBool     Boolean   任何有效的字符串或数值表达式.   CByte     Byte   0   至 ...

  2. zzuoj 10409 10409: D.引水工程

    10409: D.引水工程 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 96  Solved: 34[Submit][Status][Web Boar ...

  3. [OC Foundation框架 - 2] NSString 的创建

    A. 不可变字符串 void stringCreate() { //Don't need to release memory by this way NSString *str1 = @"S ...

  4. runtime详解2

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...

  5. SQL Server Profiler参数说明

    上图依次说明为: TextDate 依赖于跟踪中捕获的事件类的文本值: ApplicationName 创建 SQL Server 连接的客户端应用程序的名称.此列由该应用程序传递的值填充,而不是由所 ...

  6. SQL 索引

    1.http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html 2 .聚簇索引和非聚簇索引的区别 3.聚集索引:只能有一个  (相当于字 ...

  7. Lambda表达式的由来

    1.lambada表达式的本质:一个匿名方法,或说是匿名委托.从C#3.0开始支持,C#2.0只支持匿名方法语法很简单 : (输入参数)=>expr   //当参数为一个是可以省略括号.lamb ...

  8. 《Effect Java》 归纳总结

    目录: 一.创建和销毁对象 (1 ~ 7) 二.对于所有对象都通用的方法 (8 ~ 12) 三.类和接口 (13 ~ 22) 四.泛型 (23 ~ 29) 五.枚举和注解 (30 ~ 37) 六.方法 ...

  9. 一、JSP、Servlet 概要

    //jsp 1.Web.xml可以配置JSP,SERVLET,LISTENER,FILTER,标签库,JAAS,资源引用,默认页面(首页,404...),metadata-complete 2.JSP ...

  10. c#操作sqlite(包含中文支持)

    一个朋友写的,拿来分享给大家,希望有用 原文 Codeusing System; using System.Data; using System.Text.RegularExpressions; us ...