java 实现文件复制的两种方式

 
  文件复制首先我们要考虑的是用字符流还是文件流操作呢?
    若我们考虑的仅仅是文本之类的复制,字符流要好些。但是不可能总是文本文件吧,有可能是声音,图像,视频等等,所以使用字节流操作比较好。
    复制的两种方式
      1.将源文件中的内容全部读取到内存中,并一次性写入到目标文件
      2.不将源文件中的内容全部读取到内存中来,而是采取边读边写的方式
下面就是采用这两种方法对比
Java代码
  1.  package zzs.file.demo;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.OutputStream;  
  10.   
  11. public class FileCopy {  
  12.     private File inputFile;  
  13.     private File outputFile;  
  14.     private InputStream inputStream;  
  15.     private OutputStream outputStream;  
  16.     public FileCopy(String inputPath,String outputPath) throws FileNotFoundException{  
  17.         inputFile=new File(inputPath);  
  18.         outputFile=new File(outputPath);  
  19.         inputStream=new FileInputStream(inputFile);  
  20.         outputStream=new FileOutputStream(outputFile);  
  21.           
  22.     }  
  23.     //一次性把数据全部读取到内存中来,再一次性写入  
  24.     public void copy1() throws IOException{  
  25.         byte b[]=new byte[(int)inputFile.length()];  
  26.         inputStream.read(b);       //一次性读入  
  27.         outputStream.write(b);   //一次性写入  
  28. //      inputStream.close();  
  29. //      outputStream.close();  
  30.     }  
  31.     //边读边写  
  32.     public void copy2() throws IOException{  
  33.         int temp=0;  
  34.         while((temp=inputStream.read())!=-1){  
  35.             outputStream.write(temp);  
  36.         }  
  37.         inputStream.close();  
  38.         outputStream.close();  
  39.     }  
  40.       
  41.     public File getInputFile() {  
  42.         return inputFile;  
  43.     }  
  44.     public void setInputFile(File inputFile) {  
  45.         this.inputFile = inputFile;  
  46.     }  
  47.     public File getOutputFile() {  
  48.         return outputFile;  
  49.     }  
  50.     public void setOutputFile(File outputFile) {  
  51.         this.outputFile = outputFile;  
  52.     }  
  53.     public static void main(String[] args) throws IOException{  
  54.         String inputPath="e:"+File.separator+"Xfire.rar";  
  55.         String outputPath="f:"+File.separator+inputPath.substring(inputPath.indexOf(File.separator));  
  56.         FileCopy fileCopy=new FileCopy(inputPath, outputPath);  
  57.         long start1=System.currentTimeMillis();  
  58.         fileCopy.copy1();  
  59.         long end1=System.currentTimeMillis();  
  60.         System.out.println("一次性全部读入内存复制文件大小为"+fileCopy.getInputFile().length()+"位花费时间为:"+(end1-start1)+"ms");  
  61.           
  62.           
  63.         fileCopy.getOutputFile().delete();  
  64.         long start2=System.currentTimeMillis();  
  65.         fileCopy.copy2();  
  66.         long end2=System.currentTimeMillis();  
  67.         System.out.println("边读边写复制文件大小为"+fileCopy.getInputFile().length()+"位花费时间为:"+(end2-start2)+"ms");  
  68.     }  
  69.   
  70. }  

   经测试发现,对于读取文件的大小小于自身机器的内存时,采取方式1要比方式二快很多,但是若读取的文件大于自身内存则方式二好些。不过在这种情况下有更好的方式就是采取缓冲机制,读取一块,写入一块。结合了一和二的优点。
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值