`

file copy 4 methods

    博客分类:
  • java
 
阅读更多
使用 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个方法就要慢许多,,如果不使用 字节数组作为数据中转的话相信速度会更快的
分享到:
评论

相关推荐

    ISO_20462 Psychophysical experimental methods for estimating image quality

    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...

    erlang日志应用log4erl(非sasl)

    3- Create a configuration file and load it using log4erl:conf(File) &gt; log4erl:conf("priv/log4erl.conf"). 4- Alternatevly, you can create loggers & add appenders to them programmatically as ...

    DEAP2.1软件

    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. ...

    VclZip pro v3.10.1

    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 ...

    Gradle Beyond the Basics

    - **The File Methods**:Gradle提供了一系列文件方法,如`file()`、`files()`和`fileTree()`等,这些方法可以帮助用户更加灵活地处理文件和目录。 - **file()**:该方法用于创建一个文件对象,可以是文件也可以...

    Android代码-Android-App-Linking

    &gt; 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 ...

    Solaris 10 System Administration Essentials

    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...

    asp.net大文件上传解决方案实例代码

    file.CopyTo(fs); fs.Flush(); } return Json("ok"); } else { return Json("no"); } } ``` 这段代码定义了一个名为`UploadProject`的方法,接收一个`IFormFile`类型的参数`file`和一个字符串`userId`。...

    PyQt5_sip-4.19.14-cp37-none-win_amd64.whl

    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. ...

    PDF_To_JPG[无水印]

    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. ...

    [Gradle.Beyond.the.Basics(2013.7)].Tim.Berglund.文字版

    8. **The File Methods(文件方法)**: - `file()`:介绍如何创建文件对象。 - `files()`:讲解如何创建文件集合。 - `fileTree()`:描述如何构建文件树。 9. **The File Collection Interface(文件集合接口)*...

    Struts2单个文件上传

    Files.copy(file.toPath(), saveFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { e.printStackTrace(); return ERROR; } return SUCCESS; } } ``` 在HTML表单中,使用...

    jclasslib 工具修改.class文件,同时需要jad.exe做辅助

    4.点击methods--getAllDataBase--Code methods是表示方法不用说吧 getAllDataBase是刚在jd-gui里面找到的方法名 Code包含了getAllDataBase方法里所有的信息 找到"不能打开数据库连接,请检查!" 这里这个工具没有提供...

    【JavaScript源代码】vue form表单post请求结合Servlet实现文件上传功能.docx

    methods: { change(ev) { let file = ev.target.files[0]; let size = file.size; let name = file.name; // 检查文件大小 if (size &gt; 314572800) { this.$message.warning('上传文件不能超过 300M'); ...

    Gradle_Beyond_the_Basics

    - **The File Methods**:Gradle 提供了一系列文件相关的实用方法,如 `file()`、`files()` 和 `fileTree()`,这些方法简化了文件和目录的操作过程。 - **file()**:用于指定单个文件或目录。 - **files()**:用于...

    struts2上传文件实例

    Files.copy(file, saveFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { // 处理异常 } ``` 最后,别忘了处理可能出现的异常,如文件大小超出限制、文件类型不匹配等。在Action...

    移除PDF密码的软件

    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 ...

    struts2中的文件上传和下载

    Files.copy(file.getInputStream(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); return SUCCESS; } } ``` 4. **创建JSP页面**:在JSP页面中,使用Struts2的`&lt;s:form&gt;`和`&lt;s:file&gt;`标签来...

    VCLZip Pro v3.03

    - 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

    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 ...

Global site tag (gtag.js) - Google Analytics