- 浏览: 412456 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
锦毛鼠:
嗯!不错哦,先支持一下!
MySQL-Front 5 注册码 -
bolan392:
我公司现在也想用这个工具,对于商业用户所使用的版本在国内该如何 ...
IP端口扫描工具(Tenable Nessus)的简介 -
exe:
如果目录结果不变,ant其实也不需要怎么修改,直接copy。
Maven 和 ANT 的区别 -
wx3957156:
wx3957156 写道灰常好!灰常好!
利用Java生成静态HMTL页面的方法收集 -
wx3957156:
灰常好!灰常好!
利用Java生成静态HMTL页面的方法收集
使用 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种方法:管道对管道
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个方法就要慢许多,,如果不使用 字节数组作为数据中转的话相信速度会更快的..
发表评论
-
tomcat配置多个端口
2011-11-10 01:52 782http://wenku.baidu.com/view/762 ... -
读取文件方法大全
2010-04-14 09:47 725[Java]读取文件方法 ... -
java Excel 操作例子
2010-03-16 10:43 8201. package excel.jxl; ... -
2种方法遍历HashMap
2010-03-15 17:32 697可以通过2种方法遍历HashMap Map map = ... -
读取Properties文件六种方法
2010-03-12 10:50 6831。使用java.util.Properties类的load( ... -
StringBuffer 与 StringBuilder
2010-03-11 09:50 754StringBuffer 与 StringBuilder 中的 ... -
java的System.getProperty()方法可以获取的值
2010-03-08 17:28 722java的System.getProperty()方法可以获取 ... -
UUID生成随机编号(适用于数字字母混编)
2010-02-21 15:34 1646UUID(Universally Unique Ident ... -
随机产生任意位数的数字编号代码
2010-02-21 15:12 1281随机生成任意位数的编号,适用于各种商品编号。 不知道有没有更 ... -
利用Java生成静态HMTL页面的方法收集
2010-01-11 15:12 1856利用Java 生成静态HMTL ... -
jkmount不转发给TOMCAT处理
2009-12-21 11:01 3091jkmount不转发给TOMCAT处理 在网站开发中 ... -
Java Web开发中你一定会遇到的问题
2009-12-20 12:16 2719Java Web开发中,有许多 ... -
div在IE和火狐中居中处理
2009-12-18 09:34 2231#mainBody{ width: 960p ... -
IE处理含中文Json出错处理
2009-12-17 10:50 1196开发中遇到后台传递的含有中文的JSON数据到FF中没有任何问题 ... -
javascript在IE和firefox里的中文兼容问题
2009-12-06 12:39 1388针对firefox与IE对中文的编码处理不一致,IE总是以IS ... -
解决 Javascript的中文乱码问题
2009-12-06 10:56 728public static String getUTF8Str ... -
java 获得北京当前时间
2009-11-10 11:22 1374java 获得北京当前时间。 ... -
getOutputStream() has already been called for this response异常的原因和解决方法
2009-08-10 16:26 2102getOutputStream() ... -
Javascript 判断日期 格式
2009-08-06 15:24 1136function isValidDate(str) { ... -
Javascript 判断日期 格式
2009-08-06 15:20 781function isValidDate(str) { ...
相关推荐
Java实现文件拷贝的小程序 本资源是一个使用Java语言实现文件拷贝的小程序,具有很实用的功能。下面是对这个小程序的详细解释和知识点总结: 文件拷贝的基本概念 文件拷贝是将一个文件的内容复制到另一个文件中,...
首先,Java.IO类库提供了一种基于`FileInputStream`和`FileOutputStream`的文件拷贝方式。这种实现方式简单直观,通过读取源文件并写入目标文件,每次读取和写入一个缓冲区的数据。代码如下: ```java public ...
在Java中,文件拷贝是常见的数据操作之一,涉及到数据的读取和写入。文件拷贝可以通过标准的IO流来实现,其中主要有两种不同的拷贝方案。 第一种方案是将文件内容一次性读取到内存中,然后再一次性写入到目标文件。...
用java复制拷贝文本文件的不同方法和比较; 字节流,字符流等等。
Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝...
在Java编程中,实现基于网络的文件拷贝是一项常见的任务,尤其在分布式系统或云存储应用中。这个项目的关键在于高效、稳定地传输大量数据。根据提供的标题和描述,我们来详细探讨一下如何使用Java来实现这样的功能。...
这里是Java拷贝文件的java文件 可以按照自己选择要拷贝的文本文件 和将拷贝文件存放的目录 只需输入目标文件的地址 和目的文件的地址 以及文件名 即可实现 是课堂例子的拓展实现
功能强大的文件拷贝工具类 复制文件 @author:heyuelin 2011-01-06 @param srcFile 源文件File @param destDir 目标目录File @param isClone true:将按照源文件目录拷贝,false:将提取出文件拷贝到...
文件拷贝的同时,进度条同步显示拷贝进度。只需要修改源文件地址与目标文件地址即可
Java 实现文件拷贝的七种方式 Java 实现文件拷贝是 Java 编程中的一种常见操作。文件拷贝是指将源文件的内容复制到目标文件中,实现文件的备份、迁移或分享等目的。在 Java 中,可以使用多种方式实现文件拷贝,本文...
一旦连接建立成功,我们可以使用`session`对象的`execCommand()`方法执行Linux命令,比如`cp`或`rsync`进行文件拷贝。例如: ```java Channel channel = session.openChannel("exec"); ((ChannelExec) channel)....
在Java Swing中实现文件拷贝并同时显示进度条是一项常见的任务,特别是在处理大文件时,让用户了解拷贝进度是提高用户体验的重要方式。下面我们将深入探讨如何使用Java Swing来创建这样一个功能。 首先,我们需要...
文件拷贝通常涉及到`java.nio`包中的`Files`类。`copy()`方法可以从源路径复制到目标路径,确保数据的完整性和安全性。在本示例中,每个文件都会被逐个拷贝,并更新进度。 4. **进度显示**: 进度显示的关键在于...
在Java编程中,创建一个带有进度条的文件拷贝程序是一项实用技能,尤其对于那些希望增强用户界面体验的开发者来说。下面将详细讲解这个“JAVA 带进度条的文件拷贝程序”的核心知识点。 首先,我们需要理解的是,...
标题中的“一个控制文件拷贝速度的java程序”指的是一个Java程序,它的主要功能是管理文件复制过程的速度,可能是为了防止硬盘过载、优化系统资源使用或者确保数据传输的稳定性。这种程序通常会通过设置一定的速率...
在Java编程环境中,实现局域网内的文件拷贝是一项常见的任务,尤其对于系统集成、数据共享或备份场景。本文将详细讲解如何利用Java技术来复制局域网内其他计算机上的文件,并讨论如何替换文件调用路径片段以适应不同...
使用java IO技术实现将多文件中的内容集中到一个文件上 只需输入一个文件夹的路径和目的路径即可完成文件拷贝复制 并且解决了中文乱码的问题s
今天复习了一下java流的知识,做了个小例子,实现文件的拷贝。(中文和空格都能很好的读取)(PrintWriter\OutputStreamWriter\FileOutputStream)
使用java创建文件并复制到另一个文件中