- 浏览: 112102 次
- 性别:
- 来自: 上海
最新评论
-
张延龙地盘:
天下文章一大抄
zookeeper学习笔记-zkclient,curator使用 -
xuehanxin:
笨猪会费 写道你是看书学习的还是学校学习?自学的
maven学习笔记第一节一-maven install 模块之间相互引用 -
笨猪会费:
你是看书学习的还是学校学习?
maven学习笔记第一节一-maven install 模块之间相互引用 -
lianglong2000:
非常感谢!
Netty笔记一(可以运行看到结果的简单例子) -
beijishiqidu:
终于知道为什么了,端口冲突了。
Ubuntu中最重要的命令
使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢?
最近看了看NIO决定试一试 java NIO 到底有什么性能的提升.
第一种方法:古老的方式
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中的管道到管道传输
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:内存文件景象写(读文件没有使用文件景象,有兴趣的可以回去试试,,我就不试了,估计会更快)
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种方法:管道对管道
这里实现方式与第3种实现方式很类似,不过没有使用内存影射.
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); } }
下面是对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个方法就要慢许多,,如果不使用 字节数组作为数据中转的话相信速度会更快的..
不过比较惊讶的是 管道向管道传输的速度还是真挺吓人,,,
我的机器是 IDE硬盘120G 硬盘缓存2MB, 内存1GB, CPU AMD2800+
发表评论
-
动态代理-初级篇
2016-04-04 11:38 1300最近想总结一下java的动态代理,动态代理有很多种实现方案, ... -
jvm第9节-asm生成class字节码
2016-04-03 15:00 2668一、什么是ASM ASM是一个JAVA字节码分析、 ... -
jvm第8节-解析class文件
2016-03-27 15:57 1386最近看了周志明的深入java虚拟机,看到堆字节码解析这一章节 ... -
jvm第7节-锁(偏向锁,轻量锁,自旋锁)
2016-03-20 17:42 3463在介绍锁之前我们先 ... -
jvm第六节-类加载器
2016-03-13 19:20 1084类加载器是 Java 语言的一个创新,也是 Jav ... -
jvm第五节-性能调优工具使用
2016-02-21 18:52 2452很多开发人员都不是很了解,jdk在安装的时候在b ... -
jmv第四节-垃圾回收器详细讲解
2016-02-13 17:34 1131这篇文章我想和大家分享一下现在java的垃圾回收器 1. ... -
jmv第一节-jvm基础
2016-02-11 11:48 14461.jvm的启动,先看一 ... -
java总结-集合-1
2015-01-09 23:34 610记性逐渐不好,有的东西忘记,本文复习备忘用,先从最基本的j ... -
java 枚举
2014-03-23 16:06 1140Java enum的用法详解 用法一:常量 ... -
java批量插入队列笔记
2014-03-02 10:37 3062往数据库里插入大量的数据,当然是批量插入最高效,我们设定一 ... -
java多线程-生产者消费者
2014-02-07 21:58 886例子用java多线程模拟生产者消费者的例子,上代码 ... -
mmpeg转码
2013-01-09 11:43 904用例1:设置播放速率ffmpeg -i input.avi - ... -
java断点续传原理
2011-11-29 19:32 2429先说说断点续传的原理:这是HTTP 1.1协议的一部分,并不需 ... -
java实现断点续传
2011-11-29 18:56 3129用java的URL实现了一个简单的断点续传的列子,不为别的,假 ... -
和java反射有个约会
2011-11-17 19:58 657JAVA语言中的反射机制: ... -
System.arraycopy用法知多少
2011-11-17 19:33 1602先看ArrayList源码中数组 ... -
myeclipse方法和类的自动注解
2011-09-29 16:16 554设置新建类注释Window->preferences- ... -
java压缩解压
2011-09-24 18:03 874最近看到一个有关用java ... -
java多态深入理解(二)
2011-09-22 19:39 634昨天写了那个列子关于多态的故事(一),仔细想想用的并不是很合理 ...
相关推荐
用java实现文件拷贝的一个小程序,很实用的东西。
2.实现文件的拷贝与粘贴功能。3.实现文本类文件(.txt, .java, .ini, .bat, )的预览功能(比如实现对前100行文本在某个小窗口中进行预览)。4.实现文件的重命名功能。5.实现对某个文件夹进行统计功能(如统计文件夹中...
使用java IO技术实现将多文件中的内容集中到一个文件上 只需输入一个文件夹的路径和目的路径即可完成文件拷贝复制 并且解决了中文乱码的问题s
文件拷贝的同时,进度条同步显示拷贝进度。只需要修改源文件地址与目标文件地址即可
这里是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中提供了io类库,可以轻松的用java实现对文件的各种操作,如新建目录和文件,删除目录和文件,文件拷贝,目录拷贝,文件下载和保存,读取文件,移动文件,文件夹遍历,文件编码等等。
这里使用字节流实现文件拷贝。 使用java.io.File中的方法 public static void copyByFileStreams(File source, File dest){ FileInputStream inputStream = null; FileOutputStream outputStream = ...
java语言(文件和文件流知识点)实现图片的拷贝,从c盘拷贝到d盘
用java实现的文件和文件夹拷贝和转移
典型回答Java 有多种比较典型的文件拷贝实现方式,比如:利用 java.io 类库,直接为源文件构建一个 FileInputStream 读取,然后再为目标文
* This code is from the book Java Examples in a Nutshell, 2nd Edition. * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied. * You may study, use, and modify it for any non-...
3、实现文件拷贝和文件夹拷贝(文件夹拷贝指深度拷贝,包括所有子目录和文件)。 4、实现指定文件的加密和解密。 5、实现指定文件和文件夹的压缩。 6、实现压缩文件的解压。 7、文件管理器具有图形界面。 建议使用...
使用java创建文件并复制到另一个文件中
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等
主要介绍了java实现文件拷贝的七种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一个带界面的java小程序,可实现对所选任何类型的文件进行拷贝,并对此复制过程有进度条显示。代码风格良好,适合初学者借鉴。