咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
在进行Java编程时,避免不了要进行一些文件操作。虽然Java提供了很多类和方法来进行文件操作,但是由于I/O操作是比较费时的,所以我们需要考虑如何优化文件操作的效率。本文介绍了如何使用Java中的BufferedInputStream
类来提高I/O操作的效率。
摘要
本文主要介绍了如何使用Java中的BufferedInputStream
类来优化I/O操作。首先介绍了BufferedInputStream
类的作用和原理,然后分别从文件读取和文件写入两个角度,介绍了如何使用BufferedInputStream
类来提高文件操作的效率。最后通过测试用例来验证了BufferedInputStream
类的优化效果。
BufferedInputStream
简介
BufferedInputStream
是Java中的一个输入流,它实现了输入流的缓冲功能,使读取数据更加高效。当从一个InputStream
中读取数据时,Java在内部会一次读取一个字节。这种方式读取数据的效率非常低,因为每次读取都需要和硬盘或网络进行IO操作,而这些操作非常耗时。因此,使用BufferedInputStream
可以先将读取的数据缓存到内存中,在内存中慢慢读取,这样就可以减少IO操作的次数,提高读取数据的效率。在使用BufferedInputStream
时,可以通过调用read()
方法来读取数据,该方法会从缓冲区中读取数据,如果缓冲区中没有数据,则会调用底层流来读取数据。
作用和原理
BufferedInputStream
类是Java中的一个输入流缓冲器,它可以提高I/O操作的效率。BufferedInputStream
类的原理是,当我们从文件中读取数据时,它会先将数据读入内存缓冲区中,然后再从缓冲区中逐个地读取数据。这样可以减少一些不必要的I/O操作,从而提高读取数据的效率。
使用BufferedInputStream类读取文件
在进行文件读取时,我们可以使用BufferedInputStream
类来提高读取效率。下面是一个使用BufferedInputStream
类读取文件的示例代码:
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("./template/hello.txt"))) {
byte[] buffer = new byte[1024];
int length;
while ((length = bis.read(buffer)) != -1) {
// do something with the data
}
} catch (IOException e) {
// handle exception
}
上面的代码中,我们首先创建了一个BufferedInputStream
对象,并将其包装在一个try-with-resources
语句中,这样可以自动关闭资源。然后我们创建一个字节数组作为缓冲区,读取文件时每次读取1024个字节,读取到文件末尾时返回-1。我们可以在while循环中对读取到的数据进行处理。
使用BufferedInputStream
类读取文件时,每次读取的数据会先被读入缓冲区中,当缓冲区的数据被读取完后,再从文件中读取新的数据。这样可以减少I/O操作的次数,提高读取数据的效率。
使用BufferedInputStream类写入文件
在进行文件写入时,我们同样可以使用BufferedInputStream
类来提高写入效率。下面是一个使用BufferedInputStream
类写入文件的示例代码:
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("./template/hello.txt"))) {
byte[] data = "Hello, jym! ".getBytes();
bos.write(data);
} catch (IOException e) {
// handle exception
}
上面的代码中,我们首先创建了一个BufferedOutputStream
对象,并将其包装在一个try-with-resources
语句中,这样可以自动关闭资源。然后我们将要写入的数据转换成字节数组,并通过BufferedOutputStream
对象将数据写入到文件中。
使用BufferedInputStream
类写入文件时,每次写入的数据会先被写入到缓冲区中,当缓冲区的数据写满后,再将缓冲区中的数据一次性写入到文件中。这样可以减少I/O操作的次数,提高写入数据的效率。
测试用例
代码演示
为了验证BufferedInputStream
类的优化效果,我们可以编写一个测试用例。下面是一个使用BufferedInputStream
类读取文件的测试用例:
package com.example.javase.io.bufferedInputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author bug菌
* @version 1.0
* @date 2023/10/13 17:51
*/
public class BufferedInputStreamTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("./template/hello.txt"))) {
byte[] buffer = new byte[1024];
int length;
while ((length = bis.read(buffer)) != -1) {
String content = new String(buffer, 0, length);
System.out.println("读取内容为:" + content);
}
} catch (IOException e) {
// handle exception
}
long end = System.currentTimeMillis();
System.out.println("Time used: " + (end - start) + "ms");
}
}
上面的代码中,我们首先记录了开始时间,然后使用BufferedInputStream
类读取文件,并在while循环中对读取到的数据进行处理。最后,在读取数据时,将字节数组转换为字符串,并使用 System.out.println()
方法打印出来;并记录了结束时间,并输出总共使用的时间。
我们可以在不使用BufferedInputStream
类的情况下编写一个相同的测试用例,然后比较两个测试用例的运行时间,从而验证BufferedInputStream
类的优化效果。
测试代码解析
这段代码演示了如何使用BufferedInputStream
读取文件内容。
首先导入需要的类,包括BufferedInputStream
、FileInputStream
、IOException
等;
在main函数中,首先记录程序开始的时间;
使用try-with-resources
语句创建一个BufferedInputStream
对象,它包装了一个FileInputStream
对象,用于读取指定路径下的hello.txt
文件;
创建一个byte数组作为缓冲区,长度为1024;
使用while循环读取文件内容,每次读取的数据被存储在缓冲区中,长度由read()方法返回;
将从缓冲区中读取的字节转换为字符串,输出到控制台;
catch IOException
异常,处理异常;
记录程序结束的时间;
输出程序执行时间。
需要注意的是,使用BufferedInputStream
可以提高读取文件的效率,但在读取大文件时,可能会导致内存溢出,需要注意调整缓冲区的大小。
测试结果
如下是运行测试用例所得截图,仅供参考:
小结
通过本文的介绍,我们了解了如何使用Java中的BufferedInputStream
类来提高I/O操作的效率。我们可以使用BufferedInputStream
类来读取文件和写入文件,达到减少I/O操作次数、提高效率的目的。同时我们还编写了一个测试用例来验证BufferedInputStream
类的优化效果。
附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
总结
BufferedInputStream
类是Java中的一个输入流缓冲器,它可以提高I/O操作的效率。我们可以使用BufferedInputStream
类来读取文件和写入文件,达到减少I/O操作次数、提高效率的目的。通过编写测试用例,我们验证了BufferedInputStream
类的优化效果。在进行文件操作时,我们可以尽可能使用BufferedInputStream
类来提高效率。
... ...
ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。
「赠人玫瑰,手留余香」,咱们下期拜拜~~
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
📣关于我
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。