Java中缓存区的基本使用
前言
缓存区是一种内存空间,在计算机程序中被广泛使用来优化I/O操作的效率。在文件I/O操作中,缓存区用于缓存将要写入磁盘或读取到内存中的数据。这样可减少对磁盘的访问次数,提高I/O操作的效率。本文将介绍缓存区的基本使用以及一些注意点,并提供一个实例来演示如何将一个jpg图片复制一份。
使用缓存区进行文件复制
在本例中,我们将使用Java语言来进行文件复制操作,并使用缓存区来提高I/O操作的效率。具体步骤如下:
- 创建一个输入流对象,用于读取源文件。
- 创建一个输出流对象,用于写入目标文件。
- 创建一个缓存区对象,用于临时存放读取到的数据。
- 不断从输入流中读取数据,将读取到的数据写入缓存区。
- 当缓存区已满或已读取完毕时,将缓存区中的数据写入输出流,并清空缓存区。
- 重复执行步骤4~5,直到源文件全部读取完毕。
- 关闭输入流和输出流,释放资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 | //根据数据源创建字节输入流对象 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才可以决定是否追加内容。
本文来自博客园,作者:news_one,转载请注明原文链接:https://www.cnblogs.com/new-one/p/17350701.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)