前言
缓存区是一种内存空间,在计算机程序中被广泛使用来优化I/O操作的效率。在文件I/O操作中,缓存区用于缓存将要写入磁盘或读取到内存中的数据。这样可减少对磁盘的访问次数,提高I/O操作的效率。本文将介绍缓存区的基本使用以及一些注意点,并提供一个实例来演示如何将一个jpg图片复制一份。
使用缓存区进行文件复制
在本例中,我们将使用Java语言来进行文件复制操作,并使用缓存区来提高I/O操作的效率。具体步骤如下:
- 创建一个输入流对象,用于读取源文件。
- 创建一个输出流对象,用于写入目标文件。
- 创建一个缓存区对象,用于临时存放读取到的数据。
- 不断从输入流中读取数据,将读取到的数据写入缓存区。
- 当缓存区已满或已读取完毕时,将缓存区中的数据写入输出流,并清空缓存区。
- 重复执行步骤4~5,直到源文件全部读取完毕。
- 关闭输入流和输出流,释放资源。
//根据数据源创建字节输入流对象 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形参
在上述代码中,我们使用了FileInputStream
和FileOutputStream
类来进行文件读写操作。缓存区的大小为1024字节,在每次循环中读取1024字节的数据。当缓存区已满或已读取完毕时,将缓存区中的数据写入输出流,并清空缓存区。最后,我们关闭输入流和输出流,释放资源。
二次运行后出现的变化:
当我们第二次运行文件之后,我们打开target.jpg会发现大小变成了原来的两倍,出现这种情况的原因是前面使用了追加模式打开目标文件。这样,在进行文件复制时,新的内容会被添加到目标文件的末尾,所以原来的大小加上新追加的大小刚好等于原来的两倍。
注意点:
对于FileInputStream
对象,不需要传入true
参数。在使用FileInputStream
读取文件时,文件读取指针会自动跳到上一次byte
数组的最后一个位置,因此在下一次读取时,会从上一次读取结束的位置开始继续读取。而FileOutputStream
则没有这个功能,需要手动控制写入的位置,比如使用write方法进行写入操作。
总结:
在学习Java中的IO流的时候,总是将向文件中添加内容(write方法)误以为重新新建一个文件,在我的错误认知中,每次添加write方法需要添加true。但这是不对的,write方法是将字节数据添加到文件中,在一次文件创建过程中并不会覆盖原来的数据,只有新建相同的文件的时候,true才可以决定是否追加内容。
标签:基本,文件,缓存,Java,读取,写入,FileInputStream,true From: https://www.cnblogs.com/new-one/p/17350701.html