Java之简单的文件拷贝案例

需求分析:

  - 需要实现文件的拷贝操作,那么这种拷贝就有可能拷贝各种类型的文件,所以使用字节流;

  - 在进行拷贝的时候有可能需要考虑到大文件的拷贝问题;

方案设计:

  - 方案一:一次性全部拷贝;

    |- 如果拷贝的文件很大则此方法不可取,会导致程序崩溃

  - 方案二:读取一部分输出一部分;

    核心的操作:

      |- InputStream: public int read(byte[] b) throws IOException;
      |- OutputStream: public void write(byte[] b,int off,int len) throws IOException;

一个简单的文件拷贝操作:

import java.io.*;

class FileUntil {    // 定义一个文件操作的工具类
    private File srcFile;   // 源文件路径
    private File desFile;   // 目标文件路径

    public FileUntil(File srcFile,File desFile){
        this.srcFile = srcFile;
        this.desFile = desFile;
    }
    // 文件的拷贝方法
    public boolean copy() throws IOException {
        if (!this.srcFile.exists()){
            System.out.println("源文件不存在!!");
            return false;
        }
        if (!this.desFile.getParentFile().exists()){ // 如果目录不存在
            this.desFile.getParentFile().mkdirs();   // 创建父目录
        }
        byte[] data = new byte[1024];   // 开辟拷贝的缓冲区
        InputStream input = null;
        OutputStream output = null;
        try {
            // 创建字节流对象
            input = new FileInputStream(this.srcFile);
            output = new FileOutputStream(this.desFile);

            // 获取文件长度
            int len = 0;
            // 1.读取数据到数组之中,随后返回读取的个数,len = input.read(data)
            // 2.判断个数是否是 -1,如果不是则进行写入,len = input.read(data) != -1
            while ((len = input.read(data)) != -1){ // 拷贝的内容都在data数组里面
                output.write(data,0,len);
            }
            return true;
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (input != null){
                input.close();
            }
            if (output != null){
                output.close();
            }
        }
        return false;
    }
}
public class MAIN {
    public static void main(String[] args){
        long start = System.currentTimeMillis();
        File src= new File("D:" + File.separator + "Demo_2_15" + File.separator + "Writer.txt");
        File des= new File("D:" + File.separator + "Demo_2_15" + File.separator + "Copy.txt");
        FileUntil fu = new FileUntil(src,des);
        try {
            fu.copy();
        } catch (IOException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("拷贝完成、用时:" + (end - start) + "ms");
    }
}
Java之简单的文件拷贝案例

以上属于文件拷贝最原始的实现方式,从JDK1.9开始InputStream和Reader类中都追加有数据转存的处理操作方法:

InputStream: public long transferTo(OutputStream out) throws IOException;
Reader: public long transferTo(Writer out ) throws IOException;

使用上诉转存的操作处理:

import java.io.*;

class FileUntil {    // 定义一个文件操作的工具类
    private File srcFile;   // 源文件路径
    private File desFile;   // 目标文件路径

    public FileUntil(File srcFile,File desFile){
        this.srcFile = srcFile;
        this.desFile = desFile;
    }
    // 文件的拷贝方法
    public boolean copy() throws IOException {
        if (!this.srcFile.exists()){
            System.out.println("源文件不存在!!");
            return false;
        }
        if (!this.desFile.getParentFile().exists()){ // 如果目录不存在
            this.desFile.getParentFile().mkdirs();   // 创建父目录
        }
        InputStream input = null;
        OutputStream output = null;
        try {
            // 创建字节流对象
            input = new FileInputStream(this.srcFile);
            output = new FileOutputStream(this.desFile);

            input.transferTo(output);
            return true;
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (input != null){
                input.close();
            }
            if (output != null){
                output.close();
            }
        }
        return false;
    }
}
public class MAIN {
    public static void main(String[] args){
        long start = System.currentTimeMillis();
        File src= new File("D:" + File.separator + "Demo_2_15" + File.separator + "Writer.txt");
        File des= new File("D:" + File.separator + "Demo_2_15" + File.separator + "Copy.txt");
        FileUntil fu = new FileUntil(src,des);
        try {
            fu.copy();
        } catch (IOException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("拷贝完成、用时:" + (end - start) + "ms");
    }
}

 

上一篇:vue 一个数组与多个input实现v-model绑定


下一篇:模拟集成电路实践记录_MOS的特性曲线