likes
comments
collection
share

Java实现高性能的缓冲读取:BufferedReader

作者站长头像
站长
· 阅读数 22

哈喽,各位小伙伴们好,我是喵手。

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。

我是一名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()方法用于读取一行数据。当读到行尾时,会返回一行数据(不包含行尾符)。

读取方法均为阻塞式读取,如果暂时没有数据,则会一直阻塞,直到有数据可以读取。

  • MarkReset方法:

    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作为数据源的输入流,以达到高效读取的目的。

测试用例执行结果如下:

Java实现高性能的缓冲读取:BufferedReader

附上读取文件:

Java实现高性能的缓冲读取:BufferedReader

5. 性能测试结果

下面我们通过对比BufferedReader和普通读取方法的性能测试来验证BufferedReader的高性能读取能力。

测试环境:

  • JDK版本:1.8
  • 测试文件:1.6GB的文本文件
  • 测试方法:循环读取文件数据,并统计读取时间

测试结果:

读取方式读取时间
普通读取123.31s
BufferedReader41.42s

从测试结果中,可以看出BufferedReader相比普通读取方法,读取时间减少了近三倍,性能提升显著。

全文小结

本文主要介绍了Java IO包中的高性能缓冲读取工具:BufferedReader。通过使用缓冲区和预读机制,BufferedReader支持高效的数据读取。文章详细介绍了BufferedReader的作用、API方法、内部实现原理,并通过测试用例验证了其高性能读取能力。在实际开发中,应尽可能使用BufferedReader替代普通读取方法,以提高程序的性能。

... ...

最后

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。