深入理解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电子书籍、简历模板等海量资料。


相关推荐
LuckyLay15 分钟前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
向阳121828 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
Gu Gu Study38 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
小码编匠1 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
WaaTong1 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048441 小时前
初识Java EE和Spring Boot
java·java-ee
AskHarries1 小时前
Java字节码增强库ByteBuddy
java·后端
佳佳_1 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
小灰灰__1 小时前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭1 小时前
Java中的动态代理
java·开发语言·aop·动态代理