码迷,mamicode.com
首页 > 其他好文 > 详细

8.拷贝文件

时间:2016-10-08 07:41:12      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

大致思路

拷贝文件思路很清晰

  1. 建立两个文件类对象,一头一尾,一头映射源文件,一头映射目的文件
  2. 建立两个流对象,真正的文件的搬运工.
    首先,两个流得先知道他们是为哪个客户(文件)服务,所以new的时候得告诉两个搬运工他们的服务对象(使用多态,1.扩大作用域 2.提高通用性)

      // 设立管道
      InputStream indata = null;
      OutputStream outdata = null;
      // 选择流
      indata = new FileInputStream(scr);
      outdata = new FileOutputStream(dest);
    

    对于输入流,使用它的读取能力(read函数),将读到的数据装箱
    对于输出流,使用它的书写能力(write函数),将装箱的数据传送给目标文件,因为输入流将数据装箱分批读取,所以输出流就得循环读取

        while (-1 != (len = indata.read(data))) {//分箱传送
            outdata.write(data, 0, len);// 循环读取
        }
    
  3. 数据装箱
    数据装箱,就是将源文件分块的传送出去,一次传固定的大小的数据,这样做的好处就是防止一次性读取完比较大的文件会内存溢出.(ip包的道理类似).
    一个byte数组就像是一个装数据的箱子,设定箱子大小

    // 数据装箱传送
    byte[] data = new byte[1024];
    int len = 0;//数据读取实际大小
    
  4. 清尾工作
    有一个问题,就是箱子虽然较小,如果文件比箱子还小,箱子就会装不满,这时候,也就是最后,需要确保数据全部传送完毕,所以会强制输出最后一个未装满的盒子.

    //强制刷出
    outdata.flush();
    

    所有传输完毕后,关闭两个流,原则是先打开的后关闭.

    // 关闭流
        outdata.close();
        indata.close();
    

总结:

源文件------>程(:源文件代理-->输入流接手(流数据化)输出流接手-->目标文件:)序------>目的文件

源码:

package fileTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 复制文件类
 * 
 * @author Max
 * 
 */
public class FileCopy {
    /**
     * 
     * @param scrpath 源文件路径
     * @param destpath 目的文件路径
     * @throws IOException  IO异常
     * @throws FileNotFoundException     文件不存在
     */
    public static void fileCopy(String scrpath, String destpath) throws IOException,FileNotFoundException {
        fileCopy(new File(scrpath), new File(destpath));
    }
    
    /**
     * 
     * @param scr 源文件   
     * @param dest  目标文件
     * @throws IOException IO异常
     * @throws FileNotFoundException 文件不存在
     */
    public static void fileCopy(File scr, File dest) throws IOException ,FileNotFoundException{
        //输入检查
        if (!scr.isFile()) {
            System.out.println("输入不是文件,请输入文件");
            throw new FileNotFoundException("输入不是文件,请输入文件");
        }
        // 设立管道
        InputStream indata = null;
        OutputStream outdata = null;
        
        // 选择流
        indata = new FileInputStream(scr);
        outdata = new FileOutputStream(dest);
        
        // 数据装箱传送
        byte[] data = new byte[1024];
        int len = 0;//数据读取实际大小
        
        // 循环读取
        while (-1 != (len = indata.read(data))) {//分箱传送
            outdata.write(data, 0, len);
        }
        
        //强制刷出
        outdata.flush();
        
        // 关闭流
        outdata.close();
        indata.close();
    }
}

8.拷贝文件

标签:

原文地址:http://www.cnblogs.com/maxtree/p/8-kao-bei-wen-jian.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!