InputStreamReader和BufferedReader用法及实例讲解

InputStreamReader和BufferedReader用法及实例讲解

Java中,读取文件或者网络数据时,我们通常会用到InputStreamReader和BufferedReader这两个类。InputStreamReader是将字节流转换成字符流,而BufferedReader则是为了加速读取字符流而存在的。下面我们将逐步讲解这两个类的用法及实例讲解。

InputStreamReader的用法

InputStreamReader是字节流通往字符流的桥梁,将字节流(binary stream)转换成字符流(character stream),并使用指定的编码(charset)将字节流解码成字符流。因为InputStreamReader是字符读取的缓冲区,因此在创建InputStreamReader对象时需要传递InputStream对象,并且需要指定编码方式,例如:

InputStream inputStream = new FileInputStream(new File("data.txt")); // 打开文件流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); // 以UTF-8编码方式读取文件

在上述代码中,我们打开了一个文件流,并经过InputStreamReader将其转换成了字符流。需要注意的是,InputStreamReader构造器第二个参数的编码方式需要根据实际情况进行指定,对于不同国家的文字编码,需要使用相应的编码方式。

在InputStreamReader中,我们可以使用read()方法来读取数据,该方法会从InputStreamReader中读取数据,并返回读到的字符的Unicode码值。需要注意的是,该方法返回-1,表示已经读取完所有数据。示例如下:

int ch = inputStream.read();
while(ch != -1) {
    System.out.print((char) ch);
    ch = inputStream.read();
}
inputStream.close(); # 确保在读取完成后关闭文件流

在这段代码中,我们使用while循环来重复读取文件中的数据,直到读取完所有数据为止。

BufferedReader的用法

由于InputStreamReader对于每个字符都做了转换,因此它的效率相对较慢。为了解决这个问题,我们通常会使用BufferedReader来加速读取字符流。BufferedReader缓冲了字符,使得能够一次读取大量的字符,从而提高了效率。使用BufferedReader的方式如下:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String line;
while((line = bufferedReader.readLine()) != null) {
    System.out.println(line);
}
bufferedReader.close();

在这段代码中,我们首先创建了一个InputStreamReader对象,使用UTF-8编码来读取数据,然后我们又创建了一个BufferedReader对象,并且将InputStreamReader传入其中。最后利用BufferedReader的readLine()方法来读取一行数据。由于BufferedReader继承自Reader类,因此也可以使用read()方法来逐个字符读取。

值得注意的是,BufferedReader还提供了一个mark()方法与reset()方法,前者表示标记当前位置,后者表示将位置重置到最近的标记位置。示例如下:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
bufferedReader.mark(100); # 设置标记位置为100个字符之后
System.out.println(bufferedReader.readLine());
bufferedReader.reset(); # 重新回到标记位置,重复读取
System.out.println(bufferedReader.readLine());
bufferedReader.close();

在上述代码中,我们调用了mark()方法来标记当前位置,并将标记位置设为100个字符之后。然后我们读取了一行数据,并通过reset()方法将位置重置到标记位置,从而重复读取一行数据。

示例

下面我们通过一个完整的实例来演示InputStreamReader和BufferedReader的用法。在这个实例中,我们首先创建一个example.txt的文本文件,包含了一些文本内容,然后通过InputStreamReader将该文件转换成字符流,最后利用BufferedReader按行读取其中的文本内容,并输出到控制台中。

import java.io.*;

public class Main {
    public static void main(String[] args) {
        File file = new File("example.txt");
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String line;
            while((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
            bufferedReader.close();
            inputStreamReader.close();
            fileInputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这段实例代码中,我们首先创建一个File对象,该对象指向一个example.txt文件。然后我们利用FileInputStream、InputStreamReader和BufferedReader分别将该文件转换为字符流,并使用BufferedReader的readLine()方法来按行读取其中的文本内容,并输出到控制台中。最后需要调用close()方法关闭所有的流。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:InputStreamReader和BufferedReader用法及实例讲解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java编程之基于SpringBoot框架实现扫码登录

    下面我将详细讲解“Java编程之基于SpringBoot框架实现扫码登录”的完整攻略。 概述 本篇攻略将介绍如何通过SpringBoot框架实现扫码登录功能。扫码登录功能是近年来非常流行的一种登录方式,主要是便于用户的使用和提高安全性。 实现步骤 本文主要分为以下几个步骤: 配置开发环境 创建SpringBoot项目 实现扫码登录 测试运行 1. 配置开发环…

    Java 2023年5月19日
    00
  • Java简单实现定时器

    一、Java简单实现定时器 1. 实现原理 Java实现定时器的原理是通过Java语言自带的Timer和TimerTask类来完成的。Timer类可以让我们在一定的时间间隔内执行任务,而TimerTask则是具体要执行的任务。 2. 使用方法 2.1 创建定时器 Timer timer = new Timer(); 2.2 创建任务 class Task e…

    Java 2023年5月18日
    00
  • Spring源码解析之Bean的生命周期

    Spring源码解析之Bean的生命周期 在 Spring 容器启动时,会加载配置文件中的 bean 定义信息并通过反射机制创建 bean 实例,然后将这些 bean 实例化、初始化,最后将这些 bean 注册到 Spring 容器中,供外部调用。这个过程就是 Spring 容器管理 bean 的生命周期。在本文中,我们将探索 Spring 容器如何管理 b…

    Java 2023年6月15日
    00
  • Java虚拟机装载和初始化一个class类代码解析

    Java虚拟机(JVM)的主要任务之一是加载Java类并执行它们的代码。在JVM将class文件转换为可执行代码并在执行时,Java虚拟机会完成以下过程: 类加载 验证类 准备阶段 解析阶段 初始化阶段 以下是这些过程的完整详细解释: 类加载:在Java程序运行时,JVM首先会搜索类加载路径(classpath)来查找并加载字节码文件。类加载器将字节码文件读…

    Java 2023年5月26日
    00
  • 一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程

    一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程 什么是SSM框架? SSM框架是Spring MVC + Spring + MyBatis三个框架的组合。它们都是Java企业级应用程序开发中非常流行的框架。Spring MVC框架负责请求处理,Spring框架负责业务逻辑处理和依赖注入,MyBatis框架负责数据库操作…

    Java 2023年5月16日
    00
  • 类加载的生命周期包括哪些阶段?

    以下是关于类加载的生命周期包括哪些阶段的详细讲解: 类加载的生命周期包括哪些阶段? 类加载的生命周期包括以下几个阶段: 加载(Loading):将类的字码加载到内存中。 链接(Linking):将类的二进制数据合并到 Java 运行时环境中。 验证(Verification):验证的字节码是否符合 Java 虚拟机规范。 准备(Preparation):为类…

    Java 2023年5月12日
    00
  • JavaScript中的数组特性介绍

    关于JavaScript中的数组特性,我们可以从以下几个方面进行介绍: 数组的创建和初始化 JavaScript中的数组可以使用字面量和构造函数两种方式进行创建和初始化。其中,字面量方式如下: const array = [‘a’, ‘b’, ‘c’]; 构造函数方式如下: const array = new Array(‘a’, ‘b’, ‘c’); 需要…

    Java 2023年5月26日
    00
  • Java8 接口默认方法和静态方法

    当我们在定义接口时,可能会希望在接口中提供一些默认实现,这样我们在实现该接口时可以选择性地重写它们,也可以直接继承实现。Java 8 引入了接口默认方法和静态方法来实现这个目的。 接口默认方法 接口默认方法是 Java 8 新增的特性,可以直接在接口中实现方法。这些方法会被自动继承到实现该接口的所有类上。 语法格式: public interface 接口名…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部