深入理解Java中的BufferedReader类:一切从读取开始。

咦咦咦,各位小可爱,我是你们的好伙伴------bug菌,今天又来给大家普及Java之IO流等相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

js 复制代码
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

Java开发语言中,输入输出流是非常重要的一部分,可以用于与文件、网络等各种资源进行交互。其中BufferedReader类是Java的输入流类之一,主要用于从字符输入流中读取文本,并将文本缓存到缓冲区中,从而提高读取文本的效率。本文将介绍BufferedReader类的使用方法、源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例、全文小结、总结。

摘要

本文将对BufferedReader类进行深入解析,包括源代码分析、应用场景案例、优缺点分析、类代码方法介绍、测试用例等。

BufferedReader类

概述

BufferedReader是Java I/O中的一个类,它是一个带缓冲区的字符输入流,用于从字符输入流中读取字符。它提供了一种逐行读取文本文件的方法,可以轻松地读取大量文本数据,并且可以通过使用缓冲区来提高读取效率。它的主要作用是读取文本文件中的字符数据,可以读取文件中的每一行数据,是Java I/O中常用的数据读取类之一。BufferedReader类只能读取字符类型的数据,如果需要读取其他类型的数据需要进行类型转换。

优劣分析

优点:

  1. 数据缓存:通过BufferedReader类的缓存机制,可以在读取文本数据时,提高读取效率。
  2. 读取方式:BufferedReader类提供以行为单位读取数据的方法,可以方便地逐行解析文本数据。

缺点:

  • 由于BufferedReader是基于字符流的,对于读取二进制文件并不适用,不适合处理字节流。
  • 缓冲区的大小是固定的,如果输入流的内容超过了缓冲区大小,会导致缓冲区溢出。
  • 当BufferedReader类读取数据时,如果发生异常或读取过程中程序意外终止,可能会导致数据丢失。

类代码方法介绍

构造方法

  1. public BufferedReader(Reader in) 创建一个缓冲字符输入流对象,并选择指定字符输入流对象in作为其实际数据源。

  2. public BufferedReader(Reader in, int size) 创建一个缓冲字符输入流对象,并选择指定字符输入流对象in作为其实际数据源,同时指定缓冲区大小size。

成员方法

  1. public String readLine() throws IOException 从缓存中读取一行文本,并返回String类型的结果。

  2. public int read() throws IOException 从缓存中读取一个字符,并返回读取的字符的ASCII码值,如果已到达流的末尾,则返回-1。

  3. public int read(char[] cbuf, int off, int len) throws IOException 从缓存中读取字符,并将读取的字符复制到指定的字符数组cbuf中,偏移量为off,长度为len。返回实际读取的字符数。

  4. public void close() throws IOException 关闭字符流。

源代码解析

BufferedReader类是Java IO库中的一员,其源代码实现了字符缓冲输入流。它继承自Reader类,内部通过一个字符数组char[]实现了字符的缓冲读取功能。

具体实现原理如下:

java 复制代码
public class BufferedReader extends Reader {
    // 内部字符数组,用于存放从输入流中读取的字符
    private char[] cb;
    // 缓冲区的有效长度
    private int nChars;
    // 下一个字符索引
    private int nextChar;
    // 输入流对象
    private Reader in;
    // 缓冲区默认大小
    private static int defaultCharBufferSize = 8192;
    
    // 构造方法,创建一个大小为默认缓冲区大小的 BufferedReader 对象
    public BufferedReader(Reader in) {
        this(in, defaultCharBufferSize);
    }
    
    // 构造方法,创建一个指定缓冲区大小的 BufferedReader 对象
    public BufferedReader(Reader in, int sz) {
        super(in);
        ...
    }
    
    ...
}

在BufferedReader类的实现中,主要包含了缓存区数组cb[],以及nCharsnextChar两个指针,用于标记缓存区中待读取字符的位置,fill()方法用于填充缓冲区,readLine()方法用于从缓冲区中读取一行文本。

应用场景案例

BufferedReader类适用于需要高效读取字符输入流的场景,比如从文件中逐行读取文本内容、读取网络数据流等。

以下是一个使用BufferedReader读取文件内容的例子:

java 复制代码
    public static void main(String[] args) {
        File file = new File("./template/fileTest.txt");
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            //读取读取文件内容并打印
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

执行上述案例运行结果如下:

类代码方法介绍

以下是BufferedReader类中常用的方法:

  • int read(): 读取单个字符并返回。
  • int read(char[] cbuf, int off, int len): 读取字符到指定字符数组中的指定位置,并返回读取字符的数量。
  • String readLine(): 读取一行文本并返回,若到达文件结尾则返回null。
  • long skip(long n): 跳过指定数量的字符。
  • boolean markSupported(): 判断输入流是否支持markreset方法。
  • void mark(int readAheadLimit): 在当前位置做标记,以供后续reset方法调用。
  • void reset(): 将位置重置到最近的标记位置。

测试用例

为了验证BufferedReader类的功能和性能,可以编写如下测试用例:

测试代码

java 复制代码
package com.example.javase.io.bufferedReader;

import java.io.*;
import java.net.URL;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/10/18 14:23
 */
public class BufferedReaderTest {

    //读取指定文件内容
    public static void testReadFile() {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("./template/fileTest.txt"));
            String line = reader.readLine();
            System.out.println(line);
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //读取url内容
    public static void testReadURL() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(new URL("https://www.baidu.com/").openStream()));
            String line = reader.readLine();
            System.out.println(line);
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        testReadFile();
        testReadURL();
    }
}

测试结果

测试testReadFile()读取本地文件内容,测试结果如下:

测试testReadURL()方法读取指定 URL 的内容,测试结果如下:

测试代码说明

针对该类中我们定义了两个方法:testReadFile()testReadURL(),如下我具体给同学们分析一下,以增强大家对此BufferedReader类的运用及掌握。

testReadFile() 方法用于读取指定文件的内容,使用了 BufferedReaderFileReader 两个类。其中,BufferedReader 是带缓冲区的字符输入流,用来读取文本和字符数据,可以大幅提高读取效率。而 FileReader 则是文件读取流,用来读取文件内容。在方法中,先创建 BufferedReader 对象,指定其参数为 FileReader 对象,即读取指定文件的内容。然后使用 readLine 方法读取一行数据,并打印出来。最后关闭 BufferedReader 流。

testReadURL() 方法用于读取指定 URL 的内容,使用了 BufferedReaderInputStreamReader和 URL 三个类。其中,InputStreamReader是字节流通向字符流的桥梁,用来将字节流转化为字符流。URL 类则代表一个统一资源定位符,用来定位互联网上的资源。在方法中,先创建 BufferedReader 对象,指定其参数为 InputStreamReader 对象和 URL 对象。然后使用 readLine 方法读取一行数据,并打印出来。最后关闭 BufferedReader 流。

最后,在 main 方法中,调用 testReadFile()testReadURL 方法,执行方法进行内容读取。

小结

本文介绍了Java开发语言中的输入输出流,重点介绍了BufferedReader类的作用及其使用方法,源代码解析,应用场景案例,优缺点分析,类代码方法介绍,测试用例,全文小结,总结。通过本文的介绍,读者可以更加深入地了解BufferedReader类的读取机制和使用方式,为日后的Java开发工作提供帮助。

总结

BufferedReader类是Java中输入流的重要类之一,其通过缓存机制,提高了读取文本数据的效率,适用于从文件、网络等各种资源中读取文本。在使用BufferedReader类时,需要注意异常处理以及数据丢失问题。对于Java开发者来说,熟练掌握BufferedReader类的使用方法,将能够大大提高开发效率。

附录源码

如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你

最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


相关推荐
一只叫煤球的猫1 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9651 小时前
tcp/ip 中的多路复用
后端
bobz9651 小时前
tls ingress 简单记录
后端
皮皮林5513 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友3 小时前
什么是OpenSSL
后端·安全·程序员
bobz9653 小时前
mcp 直接操作浏览器
后端
前端小张同学5 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook5 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康6 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在6 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net