`
fancool
  • 浏览: 133699 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java实现文件拷贝的4种方法

阅读更多

 

转载:原文转自

http://blog.csdn.net/ta8210/archive/2008/01/30/2073817.aspx

 

使用 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个方法就要慢许多,,如果不使用 字节数组作为数据中转的话相信速度会更快的..

不过比较惊讶的是 管道向管道传输的速度还是真挺吓人,,, 

我的机器是 IDE硬盘120G 硬盘缓存2MB, 内存1GB, CPU AMD2800+

分享到:
评论

相关推荐

    用java实现文件拷贝

    Java实现文件拷贝的小程序 本资源是一个使用Java语言实现文件拷贝的小程序,具有很实用的功能。下面是对这个小程序的详细解释和知识点总结: 文件拷贝的基本概念 文件拷贝是将一个文件的内容复制到另一个文件中,...

    Java实现Linux的远程拷贝

    一旦连接建立成功,我们可以使用`session`对象的`execCommand()`方法执行Linux命令,比如`cp`或`rsync`进行文件拷贝。例如: ```java Channel channel = session.openChannel("exec"); ((ChannelExec) channel)....

    JAVA实现文件拷贝进度条同步显示

    文件拷贝的同时,进度条同步显示拷贝进度。只需要修改源文件地址与目标文件地址即可

    Java 实现拷贝文件

    这里是Java拷贝文件的java文件 可以按照自己选择要拷贝的文本文件 和将拷贝文件存放的目录 只需输入目标文件的地址 和目的文件的地址 以及文件名 即可实现 是课堂例子的拓展实现

    java实现文件拷贝的七种方式

    Java 实现文件拷贝的七种方式 Java 实现文件拷贝是 Java 编程中的一种常见操作。文件拷贝是指将源文件的内容复制到目标文件中,实现文件的备份、迁移或分享等目的。在 Java 中,可以使用多种方式实现文件拷贝,本文...

    功能强大的java实现的拷贝文件的工具类(0)

    功能强大的文件拷贝工具类  复制文件  @author:heyuelin 2011-01-06  @param srcFile 源文件File  @param destDir 目标目录File  @param isClone true:将按照源文件目录拷贝,false:将提取出文件拷贝到...

    java流实现文件拷贝

    今天复习了一下java流的知识,做了个小例子,实现文件的拷贝。(中文和空格都能很好的读取)(PrintWriter\OutputStreamWriter\FileOutputStream)

    java 文件拷贝

    Java中实现文件拷贝的示例代码如下: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class...

    java代码实现文件的拷贝

    Java的`java.io`包提供了一系列的流类来处理输入和输出操作,使得文件拷贝变得相对简单。在这个场景中,我们将深入探讨如何使用Java的IO流来实现文件的拷贝,以及相关的知识点。 首先,让我们了解`java.io`包中的...

    第12讲 Java有几种文件拷贝方式?哪一种最高效?1

    在Java编程中,文件拷贝是一项常见的操作,有多种实现方式。本节主要讨论了三种典型的方法,并探讨了它们的效率和底层实现机制。 首先,Java.IO类库提供了一种基于`FileInputStream`和`FileOutputStream`的文件拷贝...

    java实现文件拷贝

    请输入您要拷贝的源文件. 请输入您要拷贝的目标文件

    多文件内容拷贝到一个文件上(解决中文乱码) java实现

    使用java IO技术实现将多文件中的内容集中到一个文件上 只需输入一个文件夹的路径和目的路径即可完成文件拷贝复制 并且解决了中文乱码的问题s

    Java简易文件管理器

    2.实现文件的拷贝与粘贴功能。3.实现文本类文件(.txt, .java, .ini, .bat, )的预览功能(比如实现对前100行文本在某个小窗口中进行预览)。4.实现文件的重命名功能。5.实现对某个文件夹进行统计功能(如统计文件夹中...

    用java实现的文件和文件夹拷贝和转移

    用java实现的文件和文件夹拷贝和转移

    Java无敌 基于网络的文件拷贝

    在Java编程中,实现基于网络的文件拷贝是一项常见的任务,尤其在分布式系统或云存储应用中。这个项目的关键在于高效、稳定地传输大量数据。根据提供的标题和描述,我们来详细探讨一下如何使用Java来实现这样的功能。...

    java实现文件复制

    使用java创建文件并复制到另一个文件中

    用java语言(文件和文件流知识点)实现图片的拷贝,从c盘拷贝到d盘

    java语言(文件和文件流知识点)实现图片的拷贝,从c盘拷贝到d盘

    JAVA 带进度条的文件拷贝程序

    在Java编程中,创建一个带有进度条的文件拷贝程序是一项实用技能,尤其对于那些希望增强用户界面体验的开发者来说。下面将详细讲解这个“JAVA 带进度条的文件拷贝程序”的核心知识点。 首先,我们需要理解的是,...

    java 局域网拷贝文件

    总结,Java实现代理局域网文件拷贝涉及网络连接、I/O流操作和路径动态构建等多个方面。正确处理这些问题,可以确保在各种环境下稳定、高效地完成文件传输任务。在实际开发中,可以根据项目需求选择适合的方法和技术...

    JAVA实现GUI文件管理器

    3、实现文件拷贝和文件夹拷贝(文件夹拷贝指深度拷贝,包括所有子目录和文件)。 4、实现指定文件的加密和解密。 5、实现指定文件和文件夹的压缩。 6、实现压缩文件的解压。 7、文件管理器具有图形界面。 建议使用...

Global site tag (gtag.js) - Google Analytics