首页 > 代码库 > 8.拷贝文件

8.拷贝文件

  • 大致思路
  • 总结:
  • 源码:

大致思路

拷贝文件思路很清晰

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

      // 设立管道
      InputStream indata = http://www.mamicode.com/null;>

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

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

    // 数据装箱传送
    byte[] data = http://www.mamicode.com/new byte[1024];>
  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 = http://www.mamicode.com/null;>

8.拷贝文件