欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java--IO流之用字节流将原文件拷贝到目标文件中

程序员文章站 2022-06-16 13:50:00
...

已经在上一篇中详细讲了字节流的概念和分类:

http://blog.csdn.net/asheandwine/article/details/78170637

在应用程序中,IO流通常都是成对出现的,输入流和输出流一起使用。

例如文件的拷贝就需要通过输入流来读取文件中的数据,通过输出流将数据写入文件。

下面例子中用 字节流InputStream和OutputStream 来操作文件 。


首先在F 盘根目录下新建一个文本文件吗 “123.txt” .里边内容随意。

再新建一个名为 “copy” 的空文件夹 。

Java--IO流之用字节流将原文件拷贝到目标文件中

我们的目的是将F盘根目录下的“123.txt” 拷贝到 copy 文件夹内

接下来通过一个案例来演示如何进行文件的拷贝。

void write(int b) 向输出流中写入一个字节

public class FileFunction {
    public static void main(String[] args) throws FileNotFoundException {
        String fromFileName = "F:\\123.txt"; //原目标文件路径
        String toFileName = "F:\\copy\\123.txt";//拷贝后的地址
        FileFunction.copyFile(fromFileName,toFileName); // 拷贝

    }

    // 将原文件拷贝到目标文件中,如果原文件不存在,抛出 FileException 异常。
    public static void copyFile(String fromFileName, String toFileName) throws FileNotFoundException {
        //创建一个字节输入流,用于 读取 目标文件
        InputStream in = new FileInputStream(fromFileName);
        //创建一个字节输出流,用于将读取的数据 写入
        OutputStream out = new FileOutputStream(toFileName);

        int len;  // 记住每次读取的字节

        //开始进行读取和写入操作
        try {
            while ((len = in.read()) != -1) {  // 是否读到文件末尾
                out.write(len);   // 将读到的字节写入文件
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("文件拷贝成功");

        try {
            in.close(); //关闭流
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

 程序运行结束后,打开copy文件夹,发现F盘根目录下的 "123.txt" 文件被成功拷贝到了copy文件夹下。

Java--IO流之用字节流将原文件拷贝到目标文件中

在拷贝过程中,通过while循环将字节逐个进行拷贝,每循环一次就通过read( )的方法读取一个字节。
并通过write( )方法将该字节写入指定文件,循环往复,直到 len 的长度为-1,表示读取到了文件的末尾
结束循环,完成文件的拷贝。

以上虽然完成了文件的拷贝。但一个字节一个字节的读写,需要频繁的操作文件,效率很低。
当通过流的方式拷贝数据时,为了提高效率可以定义一个字节数组作为缓冲区。
在拷贝文件时,可以一次性的读取多个字节,并保存在字节数组中,
然后将字节数组里的数据一次性写入文件。

如下,只需要定义一个字节数组并且通过带参数的 read()和write()方法读写即可:

void write(byte[ ] b,int off,int len) 将指定的byte数组中从偏移量off开始的len个字节写入输出流


public class FileFunction {
    public static void main(String[] args) throws FileNotFoundException {
        String fromFileName = "F:\\123.txt"; //原目标文件路径
        String toFileName = "F:\\copy\\123.txt";//拷贝后的地址
        FileFunction.copyFile(fromFileName,toFileName); // 拷贝
      
    }

    // 将原文件拷贝到目标文件中,如果原文件不存在,抛出 FileException 异常。
    public static void copyFile(String fromFileName, String toFileName) throws FileNotFoundException {
        //创建一个字节输入流,用于 读取 目标文件
        InputStream in = new FileInputStream(fromFileName);
        //创建一个字节输出流,用于将读取的数据 写入
        OutputStream out = new FileOutputStream(toFileName);
        
        byte[] buff = new byte[1024];// 1 定义一个字节数组作为缓冲区
        int len;  // 记住每次读取的字节

        //开始进行读取和写入操作
        //read(buff) 实现将读到的字节一次性写入文件
        try {
            while ((len = in.read(buff)) != -1) {  //  2  是否读到文件末尾
                out.write(buff,0,len);   //  3 从第一个字节开始,向文件中写入 len 个字节
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("文件拷贝成功");

        try {
            in.close(); //关闭流
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

对比上一个代码方法。只在 1  2  3 处做了更改

运行结果图:
Java--IO流之用字节流将原文件拷贝到目标文件中