前言

缓存区是一种内存空间,在计算机程序中被广泛使用来优化I/O操作的效率。在文件I/O操作中,缓存区用于缓存将要写入磁盘或读取到内存中的数据。这样可减少对磁盘的访问次数,提高I/O操作的效率。本文将介绍缓存区的基本使用以及一些注意点,并提供一个实例来演示如何将一个jpg图片复制一份。

使用缓存区进行文件复制

在本例中,我们将使用Java语言来进行文件复制操作,并使用缓存区来提高I/O操作的效率。具体步骤如下:

  1. 创建一个输入流对象,用于读取源文件。
  2. 创建一个输出流对象,用于写入目标文件。
  3. 创建一个缓存区对象,用于临时存放读取到的数据。
  4. 不断从输入流中读取数据,将读取到的数据写入缓存区。
  5. 当缓存区已满或已读取完毕时,将缓存区中的数据写入输出流,并清空缓存区。
  6. 重复执行步骤4~5,直到源文件全部读取完毕。
  7. 关闭输入流和输出流,释放资源。
        //根据数据源创建字节输入流对象
        FileInputStream fis = new FileInputStream("./src/copy/three/io/copy.jpg");
        //根据目的地创建输出流对象
        FileOutputStream fos = new FileOutputStream("./src/copy/three/io/target.jpg",true);
        //固定传输的数据大小(缓存区)至多为1024
        byte[] bys = new byte[1024];
        int len;
        while((len=fis.read(bys))!=-1){
            fos.write(bys,0,len);
        }

        fos.close();
        fis.close();

  注意:这里在创建输出流对象添加了一个true形参

在上述代码中,我们使用了FileInputStreamFileOutputStream类来进行文件读写操作。缓存区的大小为1024字节,在每次循环中读取1024字节的数据。当缓存区已满或已读取完毕时,将缓存区中的数据写入输出流,并清空缓存区。最后,我们关闭输入流和输出流,释放资源。

二次运行后出现的变化:

当我们第二次运行文件之后,我们打开target.jpg会发现大小变成了原来的两倍,出现这种情况的原因是前面使用了追加模式打开目标文件。这样,在进行文件复制时,新的内容会被添加到目标文件的末尾,所以原来的大小加上新追加的大小刚好等于原来的两倍。

注意点:

对于FileInputStream对象,不需要传入true参数。在使用FileInputStream读取文件时,文件读取指针会自动跳到上一次byte数组的最后一个位置,因此在下一次读取时,会从上一次读取结束的位置开始继续读取。而FileOutputStream则没有这个功能,需要手动控制写入的位置,比如使用write方法进行写入操作。

总结:

在学习Java中的IO流的时候,总是将向文件中添加内容(write方法)误以为重新新建一个文件,在我的错误认知中,每次添加write方法需要添加true。但这是不对的,write方法是将字节数据添加到文件中,在一次文件创建过程中并不会覆盖原来的数据,只有新建相同的文件的时候,true才可以决定是否追加内容。