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日

相关文章

  • 通过JDK源码角度分析Long类详解

    通过JDK源码角度分析Long类详解 介绍Long类 Long类是java.lang包下的一个类,它是用来表示64位长整型数字的。在实际开发中,经常使用Long类来处理需要存储大整数的应用场景。 Long类的声明 public final class Long extends Number implements Comparable<Long> …

    Java 2023年5月26日
    00
  • 苞米豆的多数据源 → dynamic-datasource-spring-boot-starter,挺香的!

    开心一刻   2023年元旦,我妈又开始了对我的念叨   妈:你到底想多少岁结婚   我:60   妈:60,你想找个多大的   我:找个55的啊,她55我60,结婚都有退休金,不用上班不用生孩子,不用买车买房,成天就是玩儿   我:而且一结婚就是白头偕老,多好   我妈直接一大嘴巴子呼我脸上 需求背景   最近接到一个需求,需要从两个数据源获取数据,然后进…

    Java 2023年4月22日
    00
  • Java网络编程的作用是什么?

    Java网络编程是指利用Java编程语言,使用Java自带的网络编程库(包括但不限于java.net包和java.io包)来实现网络编程功能。Java网络编程的作用主要是实现网络间的通信,使得不在同一物理位置的计算机和设备能够相互交流和传输数据,实现信息的传递和共享。 Java网络编程常用的功能包括创建Socket连接、发送和接收数据、实现服务端和客户端的通…

    Java 2023年5月11日
    00
  • Spring实战之类级别缓存实现与使用方法

    Spring实战之类级别缓存实现与使用方法 什么是类级别缓存 类级别缓存是一种基于类级别的缓存技术,能够缓存相同参数的方法的返回结果,从而提高系统响应速度和请求处理效率。 Spring中的缓存实现 Spring Framework提供了一套完整的缓存抽象和实现,使用Spring Framework提供的缓存,我们可以将缓存所涉及的实现细节从业务逻辑代码中解耦…

    Java 2023年5月19日
    00
  • Java-lambda表达式入门看这一篇就够了

    Java-lambda表达式入门看这一篇就够了 什么是Lambda表达式? Lambda表达式是Java 8的新特性,它允许我们以更简洁的方式编写匿名内部类,使代码更易读易写。Lambda表达式本质上就是一个函数,不需要写函数名,可以传递到需要函数式接口的任何地方。Lambda表达式由参数列表、箭头符号和函数体组成,其中箭头符号可以理解为“传递至”的意思,函…

    Java 2023年5月26日
    00
  • Java多线程编程基石ThreadPoolExecutor示例详解

    Java多线程编程基石ThreadPoolExecutor示例详解 简介 Java的多线程编程需要使用线程池Thread Pool。线程池是一组线程集合,可以被执行多次,且必须共享一份线程队列和一个线程池。ThreadPoolExecutor是Java中一个高级线程池,提供了许多用于线程池管理的功能。本文将详细介绍ThreadPoolExecutor的相关内…

    Java 2023年5月19日
    00
  • JVM的垃圾回收算法工作原理详解

    JVM的垃圾回收算法工作原理详解 什么是垃圾回收? 垃圾回收是指自动管理程序中动态分配的内存的过程。在垃圾回收的过程中,垃圾收集器会扫描程序中的内存,查找出无用的对象,然后将它们的内存空间释放掉。这样就可以避免内存泄漏和程序崩溃。 垃圾回收算法 垃圾回收算法的目标是找出内存中无用的对象,然后回收这些对象所占用的内存空间。JVM采用的主要的垃圾回收算法有标记-…

    Java 2023年5月19日
    00
  • Java对象布局(JOL)实现过程解析

    Java对象布局(JOL)实现过程解析 JOL简介 Java对象布局(JOL)是一款用于分析Java对象内存布局的工具。通过使用JOL,可以知道Java对象的内存结构、大小、对齐方式、是否是线程安全的等信息。JOL可以根据不同的JVM实现,提供与JVM相关的内存分布、布局信息。 JOL是由OpenJDK项目的Java人员负责维护和支持的高度可靠的工具。 安装…

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