- 浏览: 187091 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhulin0504:
必须赞
浅谈Java内部类的四个应用场景 -
zhmy0129:
想打印 表起来。
软件工程师的7年总结 -
RonQi:
lionkingzw 写道pop1030123 写道wly71 ...
java调用python -
linchixiong:
有种茅塞顿开的感觉,感谢啊~~
浅谈Java内部类的四个应用场景 -
hnzhoujunmei:
为什么没有完整的源码啊?
用 Java 通过串口发送手机短信
使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢?
最近看了看NIO决定试一试 java NIO 到底有什么性能的提升.
第一种方法:古老的方式
方法的2参数分别是原始文件,和拷贝的目的文件.这里不做过多介绍.
实现方法很简单,分别对2个文件构建输入输出流,并且使用一个字节数组作为我们内存的缓存器, 然后使用流从f1 中读出数据到缓存里,在将缓存数据写到f2里面去.这里的缓存是2MB的字节数组
第2种方法:使用NIO中的管道到管道传输
实现方法:在第一种实现方法基础上对输入输出流获得其管道,然后分批次的从f1的管道中像f2的管道中输入数据每次输入的数据最大为2MB
方法3:内存文件景象写(读文件没有使用文件景象,有兴趣的可以回去试试,,我就不试了,估计会更快)
实现方法:跟伤2个例子不一样,这里写文件流没有使用管道而是使用内存文件映射(假设文件f2在内存中).在循环中从f1的管道中读取数据到字节数组里,然后在像内存映射的f2文件中写数据.
第4种方法:管道对管道
这里实现方式与第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个方法就要慢许多,,如果不使用 字节数组作为数据中转的话相信速度会更快的
最近看了看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个方法就要慢许多,,如果不使用 字节数组作为数据中转的话相信速度会更快的
发表评论
-
apache commons-collections BagUtils
2010-01-20 12:55 1219import java.util.Iterator; i ... -
bug2
2010-01-13 14:01 1571010-1-12 15:33:59 org.apache.ca ... -
Apache Commons
2010-01-13 11:28 1643Apache Commons包含了很多开源的工具,用于解决平时 ... -
大文件上传
2010-01-12 15:35 1294package com.fuyou; import ja ... -
replaceAll 大小写敏感
2010-01-11 10:58 1376public class Test{ public sta ... -
jar文件运行时:Failed to load Main-Class manifest attribute from ......解决办法
2009-12-22 14:37 1846打包好的jar文件双击运行时报: Failed to load ... -
转载
2009-12-13 00:11 7711. Java语言基础 谈到Java语言基础学习的书 ... -
HttpSession和Hibernate里的Session的区别
2009-12-09 21:46 1559HttpSession和Hibernate里的Session的 ... -
java 10
2009-12-09 16:53 7821、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一 ... -
bug
2009-12-02 09:23 1025Error 503 Service Unavailable 一 ... -
PO BO VO DTO POJO DAO概念及其作用(转)
2009-11-29 20:17 1045引用J2EE开发中大量的专 ... -
JAVA里的PING和TELNET
2009-11-29 16:45 1258JAVA里的PING是在JDK 1.5后用了新的函数isrea ... -
awt swing swt
2009-11-27 14:00 877特性 AWT Swing SWT实现机制 awt采用最小公 ... -
thread local
2009-11-26 13:40 913在利用Hibernate开发DA ... -
用 Java 通过串口发送手机短信
2009-11-26 11:03 2076引用JAVA_HOME是 C:\jdk1.6.0_02 Pat ... -
下载链接直接打开
2009-11-26 11:01 2099关键字: 点击pdf/word等链接时时, 直接打开而不是下载 ... -
iframe 防止挂马的问题
2009-11-26 10:59 928据侠客站长站了解,现在流行的CMS系统中,挂马主要有以下几种 ... -
mobile ip identify card interface
2009-11-26 10:48 9011. 查询手机:http://www.yodao.com/sm ... -
5 module
2009-11-26 10:45 753一,最好模板 www.bestmoban.com 提供免费 ... -
java操作properties文件
2009-11-26 10:44 713package control; import java ...
相关推荐
to be overcome, including image file size, and a static interface rather than one allowing dynamic updating of the reference image. The method that we developed and tested uses reference anchor images...
3- Create a configuration file and load it using log4erl:conf(File) > log4erl:conf("priv/log4erl.conf"). 4- Alternatevly, you can create loggers & add appenders to them programmatically as ...
4. If the files are stored in a DEAP.ZIP file, you will then need to unzip (extract) the files by double-clicking on the zip file and extracting the contents of the zip file into the DEAP folder. ...
Overloaded TStream Methods for Delphi 4,5, BCB 4, and 5 - UnZipToStream - UnZipToStreamByIndex - ZipFromStream Special OnGetNextTStream Event for Delphi 4,5, BCB 4, and 5 - Allows zipping multiple ...
- **The File Methods**:Gradle提供了一系列文件方法,如`file()`、`files()`和`fileTree()`等,这些方法可以帮助用户更加灵活地处理文件和目录。 - **file()**:该方法用于创建一个文件对象,可以是文件也可以...
> The ultimate developer guide to Android application linking methods Read documentation at https://simonmarquis.github.io/Android-App-Linking License Copyright 2017 Simon Marquis Licensed under ...
1.1 Methods to Meet Your Needs 1 1.2 The Basics of Solaris Installation 2 1.2.1 Installing Solaris on a SPARC System 6 1.2.2 Installing Solaris on an x86 System 9 1.3 Solaris JumpStart Installation 13...
file.CopyTo(fs); fs.Flush(); } return Json("ok"); } else { return Json("no"); } } ``` 这段代码定义了一个名为`UploadProject`的方法,接收一个`IFormFile`类型的参数`file`和一个字符串`userId`。...
The format of a specification file is almost identical to a C or C++ header file, so much so that the easiest way of creating a specification file is to edit the corresponding header file. ...
To purchase PDFtoJPG use one of the following methods: 1. Online - Complete and submit the Secure Order Form available from URL https://www.regnow.com/softsell/nph-softsell.cgi?item=11868-4, or 2. ...
8. **The File Methods(文件方法)**: - `file()`:介绍如何创建文件对象。 - `files()`:讲解如何创建文件集合。 - `fileTree()`:描述如何构建文件树。 9. **The File Collection Interface(文件集合接口)*...
Files.copy(file.toPath(), saveFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { e.printStackTrace(); return ERROR; } return SUCCESS; } } ``` 在HTML表单中,使用...
4.点击methods--getAllDataBase--Code methods是表示方法不用说吧 getAllDataBase是刚在jd-gui里面找到的方法名 Code包含了getAllDataBase方法里所有的信息 找到"不能打开数据库连接,请检查!" 这里这个工具没有提供...
methods: { change(ev) { let file = ev.target.files[0]; let size = file.size; let name = file.name; // 检查文件大小 if (size > 314572800) { this.$message.warning('上传文件不能超过 300M'); ...
- **The File Methods**:Gradle 提供了一系列文件相关的实用方法,如 `file()`、`files()` 和 `fileTree()`,这些方法简化了文件和目录的操作过程。 - **file()**:用于指定单个文件或目录。 - **files()**:用于...
Files.copy(file, saveFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { // 处理异常 } ``` 最后,别忘了处理可能出现的异常,如文件大小超出限制、文件类型不匹配等。在Action...
The standard security provided by PDF consists of two different methods and two different passwords. A PDF document may be protected by password for opening ('user' password) and the document may ...
Files.copy(file.getInputStream(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); return SUCCESS; } } ``` 4. **创建JSP页面**:在JSP页面中,使用Struts2的`<s:form>`和`<s:file>`标签来...
- If a file does not extend beyond any of the original limitations (filesizes of 4 gig or 65535 files) then no Zip64 format information is included in the archive.- property isZip64 - tells you when ...
ASP.NET MVC validation scripts have been moved to their own file 4 ASP.NET MVC validation scripts can be included at the top or bottom of a page 4 ASP.NET MVC validation scripts support globalization ...