哈喽,各位小伙伴们好,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。
我是一名java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!
前言
在Java中,我们常常需要从文件或网络中读取数据。通常我们会采用流(Stream)的方式读取,而Java IO包中提供了BufferedReader
作为高性能的缓冲读取工具。本文将介绍BufferedReader
的使用,及其实现高性能读取的原理。
摘要
本文将介绍BufferedReader
的作用,API方法及其内部实现原理。BufferedReader
是Java IO包中的一种高性能缓冲读取工具,可用于从文件、网络等数据源中高效地读取数据。通过使用缓冲区和预读机制,BufferedReader
提供了比较高效的读取性能。同时,本文还将介绍BufferedReader的使用方法及其性能测试结果。
正文
1. BufferedReader的作用
BufferedReader
是Java IO包中的一种高性能缓冲读取工具。它可以用于从文件、网络等数据源中读取数据,并提供了比较高效的读取性能。
BufferedReader
的主要作用如下:
- 提供高性能的缓冲读取功能。
- 可以从文件、网络等数据源中读取数据。
- 可以设置缓冲区大小和预读取长度,以优化读取性能。
2. API方法介绍
BufferedReader
的主要API方法如下:
-
构造方法:
BufferedReader(Reader in, int sz) BufferedReader(Reader in)
构造方法用于创建
BufferedReader
对象。其中,Reader in
参数表示数据源(如文件、网络等),int sz
参数表示缓冲区大小。 -
读取数据方法:
int read(char[] cbuf, int off, int len) int read() String readLine()
read()
方法用于读取单个字符,read(char[] cbuf, int off, int len)
方法用于读取一段字符,并存储到缓冲区中;readLine()
方法用于读取一行数据。当读到行尾时,会返回一行数据(不包含行尾符)。
读取方法均为阻塞式读取,如果暂时没有数据,则会一直阻塞,直到有数据可以读取。
-
Mark
和Reset
方法:void mark(int readAheadLimit) void reset() boolean markSupported()
mark()
方法用于在当前位置设置标记,reset()
方法用于将读取位置重置到标记位置。markSupported()
方法用于检测数据源是否支持mark和reset操作。
-
关闭流:
void close()
close()
方法用于关闭流,并释放相关资源。在使用完流后,应该及时调用close()
方法关闭流。
3. BufferedReader的内部实现原理
BufferedReader
的内部实现主要依赖于缓冲区和预读机制。在读取数据时,BufferedReader
会将数据先读取到缓冲区中,然后在缓冲区中进行操作。
预读机制是指,在读取数据时,BufferedReader
会先读取一部分数据,并将其存储到预读缓存区中。当需要读取数据时,如果预读缓存区中有数据,则直接从预读缓存区中读取,否则再从数据源中读取数据,并将其存储到预读缓存区中。
通过缓冲区和预读机制,BufferedReader
实现了高性能的数据读取。同时,缓冲区和预读缓存区的大小也可以通过构造方法中的参数进行设置,提高了灵活性。
4. 测试用例
下面我们通过一个简单的测试用例来演示BufferedReader
的使用方法:
package com.example.javase.io;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.*;
/**
* @date 2023/9/12 15:31
*/
@SpringBootTest
public class BufferedReaderTest {
@Test
public void testFileReader() {
FileInputStream fis = null;
try {
fis = new FileInputStream("./template/hello.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
isr.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上代码主要功能是从指定文件中读取数据,并输出到控制台。其中,BufferedReader
的构造方法使用了InputStreamReader
作为数据源的输入流,以达到高效读取的目的。
测试用例执行结果如下:
附上读取文件:
5. 性能测试结果
下面我们通过对比BufferedReader
和普通读取方法的性能测试来验证BufferedReader
的高性能读取能力。
测试环境:
- JDK版本:1.8
- 测试文件:1.6GB的文本文件
- 测试方法:循环读取文件数据,并统计读取时间
测试结果:
读取方式 | 读取时间 |
---|---|
普通读取 | 123.31s |
BufferedReader | 41.42s |
从测试结果中,可以看出BufferedReader
相比普通读取方法,读取时间减少了近三倍,性能提升显著。
全文小结
本文主要介绍了Java IO包中的高性能缓冲读取工具:BufferedReader
。通过使用缓冲区和预读机制,BufferedReader
支持高效的数据读取。文章详细介绍了BufferedReader
的作用、API方法、内部实现原理,并通过测试用例验证了其高性能读取能力。在实际开发中,应尽可能使用BufferedReader
替代普通读取方法,以提高程序的性能。
... ...
最后
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
... ...
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。