`
忘忧鸟
  • 浏览: 145002 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 拷贝文件

    博客分类:
  • Java
阅读更多

第一种方法:古老的方式  
 

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 inins=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 ininC=in.getChannel();   
        FileChannel outoutC=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 ininC=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);   
            outoutC=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 ininC=in.getChannel();   
        FileChannel outoutC=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!  

 

分享到:
评论

相关推荐

    Java 实现拷贝文件

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

    用java实现文件拷贝

    在`main()`方法中,我们创建了一个`Main`对象,并调用其`copy()`方法来拷贝文件。在这个例子中,我们将源文件"d:\\1.txt"拷贝到目标文件"d:\\2.txt"中。 异常处理 在这个小程序中,我们使用了`throws`关键字来声明...

    java实现一个目录下全部文件复制到另一目录

    在Java编程语言中,复制一个目录下的所有文件到另一个目录是一项常见的任务,特别是在处理文件系统操作时。这个过程涉及到文件的遍历、读取和写入。以下将详细讲解如何实现这一功能,以及相关的Java API和技术点。 ...

    java 文件拷贝

    在拷贝文件时,需要考虑文件的实际存在性,如果源文件不存在,则拷贝无法进行,程序需要给出相应的提示并退出。另外,在写入目标文件之前,需要确保目标路径已经创建,如果目标路径的父目录不存在,则应该使用mkdirs...

    java swing拷贝文件进度条

    Java提供了一个名为`java.nio.file.Files`的类,它包含了一些静态方法,如`copy()`,可以用来拷贝文件。以下是一个简单的文件拷贝示例: ```java import java.nio.file.Files; import java.nio.file.Path; import ...

    Java实现Linux的远程拷贝

    在IT行业中,Java是一种广泛应用的编程语言,它不仅在企业级应用中表现出色,也能够实现各种系统级别的功能,如远程文件操作。本篇将详细探讨如何使用Java来实现Linux系统的远程拷贝功能。 首先,要实现Linux的远程...

    java 递归拷贝文件显示进度demo

    在Java编程中,递归拷贝文件是一种常见操作,特别是在处理目录结构时。这个"java 递归拷贝文件显示进度demo"是一个实用的示例,它不仅实现了从一个源目录到目标目录的深度拷贝,而且还提供了进度显示功能,这对于...

    Java SE程序 文件的拷贝InputStream类

    Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝...

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

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

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

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

    java 局域网拷贝文件

    在Java编程环境中,实现局域网内的文件拷贝是一项常见的任务,尤其对于系统集成、数据共享或备份场景。本文将详细讲解如何利用Java技术来复制局域网内其他计算机上的文件,并讨论如何替换文件调用路径片段以适应不同...

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

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

    JAVA SFTP文件上传、下载及批量下载实例

    JAVA SFTP文件上传、下载及批量下载实例 在本篇文章中,我们将详细介绍JAVA SFTP文件上传、下载及批量下载的实例,包括相关的概念、API介绍、代码实现等方面的内容。 首先,我们需要了解什么是SFTP?SFTP(Secure ...

    自动拷贝class等文件

    介绍下这个打包工具 把本次你改动的java工程下的文件对应的class文件自动打包,然后热部署发布即可 如果你需要频繁改动java代码,热发布几个文件到服务器上,你会怎么做呢? 没有工具的人会手动拷贝目录 然后到...

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

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

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

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

    Java简易文件管理器

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

    java实现文件复制

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

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

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

Global site tag (gtag.js) - Google Analytics