- 浏览: 163983 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
Eywa:
方法是对的。不过此方法只能在IE浏览器下生效,其他非IE内核的 ...
使用JavaScript读取本地文本文件 -
wyfn18:
好厉害
Rational Rose 2003破解版的下载与安装 -
晓子你好:
有用,挺
exe4J的下载地址和注册码 -
this_super:
...
jxl.jar包简介/java操作excel jxl.jar下载地址 -
aocshallo:
看来我的JAVA才刚刚开始啊~
一个Java程序员应该掌握的10项技能
使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢?
最近看了看NIO决定试一试 java NIO 到底有什么性能的提升.
第一种方法:古老的方式
Java code复制代码public static long forJava(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
byte[] buffer=new byte[length];
while(true){
int ins=in.read(buffer);
if(ins==-1){
in.close();
out.flush();
out.close();
return new Date().getTime()-time;
}else
out.write(buffer,0,ins);
}
}方法的2参数分别是原始文件,和拷贝的目的文件.这里不做过多介绍.
实现方法很简单,分别对2个文件构建输入输出流,并且使用一个字节数组作为我们内存的缓存器, 然后使用流从f1 中读出数据到缓存里,在将缓存数据写到f2里面去.这里的缓存是2MB的字节数组
第2种方法:使用NIO中的管道到管道传输
Java code复制代码 public static long forTransfer(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
FileChannel inC=in.getChannel();
FileChannel outC=out.getChannel();
int i=0;
while(true){
if(inC.position()==inC.size()){
inC.close();
outC.close();
return new Date().getTime()-time;
}
if((inC.size()-inC.position())<20971520)
length=(int)(inC.size()-inC.position());
else
length=20971520;
inC.transferTo(inC.position(),length,outC);
inC.position(inC.position()+length);
i++;
}
}实现方法:在第一种实现方法基础上对输入输出流获得其管道,然后分批次的从f1的管道中像f2的管道中输入数据每次输入的数据最大为2MB
方法3:内存文件景象写(读文件没有使用文件景象,有兴趣的可以回去试试,,我就不试了,估计会更快)
Java code复制代码 public static long forImage(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
RandomAccessFile out=new RandomAccessFile(f2,"rw");
FileChannel inC=in.getChannel();
MappedByteBuffer outC=null;
MappedByteBuffer inbuffer=null;
byte[] b=new byte[length];
while(true){
if(inC.position()==inC.size()){
inC.close();
outC.force();
out.close();
return new Date().getTime()-time;
}
if((inC.size()-inC.position())<length){
length=(int)(inC.size()-inC.position());
}else{
length=20971520;
}
b=new byte[length];
inbuffer=inC.map(MapMode.READ_ONLY,inC.position(),length);
inbuffer.load();
inbuffer.get(b);
outC=out.getChannel().map(MapMode.READ_WRITE,inC.position(),length);
inC.position(b.length+inC.position());
outC.put(b);
outC.force();
}
}实现方法:跟伤2个例子不一样,这里写文件流没有使用管道而是使用内存文件映射(假设文件f2在内存中).在循环中从f1的管道中读取数据到字节数组里,然后在像内存映射的f2文件中写数据.
第4种方法:管道对管道
Java code复制代码 public static long forChannel(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
FileChannel inC=in.getChannel();
FileChannel outC=out.getChannel();
ByteBuffer b=null;
while(true){
if(inC.position()==inC.size()){
inC.close();
outC.close();
return new Date().getTime()-time;
}
if((inC.size()-inC.position())<length){
length=(int)(inC.size()-inC.position());
}else
length=2097152;
b=ByteBuffer.allocateDirect(length);
inC.read(b);
b.flip();
outC.write(b);
outC.force(false);
}
}这里实现方式与第3种实现方式很类似,不过没有使用内存影射.
下面是对49.3MB的文件进行拷贝的测试时间(毫秒)
Start Copy File... file size:50290KB
CopyFile:b1.rmvb mode:forChannel RunTime:3203
CopyFile:b1.rmvb mode:forImage RunTime:3328
CopyFile:b1.rmvb mode:forJava RunTime:2172
CopyFile:b1.rmvb mode:forTransfer RunTime:1406
End Copy File!
解释: 在测试结果中看到 古老方式,和管道向管道传输是最快的,,,,,为什么呢?
我分析是这样的,由于另外2种方法内部都使用了 字节数组作为缓存中转,在加上NIO内部有一个贴近系统的缓存区,这无意就增加了另一个缓存器,所以相对于这2个方法就要慢许多,,如果不使用 字节数组作为数据中转的话相信速度会更快的..
不过比较惊讶的是 管道向管道传输的速度还是真挺吓人,,,
发表评论
-
POI操作WORD
2012-01-01 15:04 1211通过下面的两种方法可以从文档里读取所有字符 ... -
URI、URL和URN的关系
2011-10-10 21:36 918URI、URL和URN是识别、定位和命名互联网上的资源的标准途 ... -
对象与字节数组之间的转换
2011-07-05 15:15 1394将对象转换成字节数组 public byte[] objec ... -
exe4J的下载地址和注册码
2011-07-04 16:55 9185今天 有幸学了一个软件,分享给大家 exe4j ... -
JDBC连接DB2、Oracle、MySQL、PostgreSQL
2011-06-30 11:03 712package c ... -
Java 内存管理原理、内存泄漏实例及解决方案研究
2011-02-22 12:45 890在项目的最后阶段, ... -
正则表达式基础教程
2010-10-28 09:31 950字符 x 字 ... -
如何在Eclipse上安装VE1.4
2010-10-27 09:00 1037http://wiki.eclipse.org/VE/Upda ... -
SWT_AWT_Swing事件处理机制
2010-10-21 08:33 4193总的来说Swing/AWT和SWT ... -
在SQL Server 2000中获取表结构
2010-10-15 07:10 1109SELECT 表名 = case when ... -
JAVA反射机制
2010-10-13 14:36 808在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属 ... -
实现SWT中Table单元格的可编辑
2010-10-12 14:19 1897public void editorTable(Table t ... -
俄罗斯方块
2010-10-11 13:55 901//俄罗斯方块Java源代码i ... -
java文件操作大全
2010-10-11 13:46 1105文件的建立/检查与删除 ... -
java调用bat文件
2010-10-09 17:57 3338Runtime.getRuntime().exec(" ... -
Spket的使用
2010-10-08 20:51 1924在开发EXT中,我分别使用了Aptana和Spket 一、Sp ... -
jxl.jar包简介/java操作excel jxl.jar下载地址
2010-10-04 21:53 2584下载地址: http://www.andykhan.com/j ... -
JDBC连接DB2、Oracle、MySQL、PostgreSQL
2010-10-04 21:45 987package com.terac.util; import ... -
一个Java程序员应该掌握的10项技能
2010-10-04 21:34 1725语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应 ... -
向Excel中写入内容
2010-09-30 16:33 1366package com.preader.shareinfo.u ...
相关推荐
用java实现文件拷贝的一个小程序,很实用的东西。
文件拷贝的同时,进度条同步显示拷贝进度。只需要修改源文件地址与目标文件地址即可
这里是Java拷贝文件的java文件 可以按照自己选择要拷贝的文本文件 和将拷贝文件存放的目录 只需输入目标文件的地址 和目的文件的地址 以及文件名 即可实现 是课堂例子的拓展实现
今天复习了一下java流的知识,做了个小例子,实现文件的拷贝。(中文和空格都能很好的读取)(PrintWriter\OutputStreamWriter\FileOutputStream)
NULL 博文链接:https://hb-yym-929.iteye.com/blog/1062642
功能强大的文件拷贝工具类 复制文件 @author:heyuelin 2011-01-06 @param srcFile 源文件File @param destDir 目标目录File @param isClone true:将按照源文件目录拷贝,false:将提取出文件拷贝到...
请输入您要拷贝的源文件. 请输入您要拷贝的目标文件
用java实现的文件和文件夹拷贝和转移
使用java创建文件并复制到另一个文件中
使用java IO技术实现将多文件中的内容集中到一个文件上 只需输入一个文件夹的路径和目的路径即可完成文件拷贝复制 并且解决了中文乱码的问题s
java语言(文件和文件流知识点)实现图片的拷贝,从c盘拷贝到d盘
2.实现文件的拷贝与粘贴功能。3.实现文本类文件(.txt, .java, .ini, .bat, )的预览功能(比如实现对前100行文本在某个小窗口中进行预览)。4.实现文件的重命名功能。5.实现对某个文件夹进行统计功能(如统计文件夹中...
典型回答Java 有多种比较典型的文件拷贝实现方式,比如:利用 java.io 类库,直接为源文件构建一个 FileInputStream 读取,然后再为目标文
这里使用字节流实现文件拷贝。 使用java.io.File中的方法 public static void copyByFileStreams(File source, File dest){ FileInputStream inputStream = null; FileOutputStream outputStream = ...
3、实现文件拷贝和文件夹拷贝(文件夹拷贝指深度拷贝,包括所有子目录和文件)。 4、实现指定文件的加密和解密。 5、实现指定文件和文件夹的压缩。 6、实现压缩文件的解压。 7、文件管理器具有图形界面。 建议使用...
主要介绍了java实现文件拷贝的七种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等
一个带界面的java小程序,可实现对所选任何类型的文件进行拷贝,并对此复制过程有进度条显示。代码风格良好,适合初学者借鉴。
本文介绍java实现文件拷贝的代码片断,大家可以直接放到程序里运行
java实现excel表格文件的复制,测试可用,将excel表格的表头和内容拷贝到新表中