ZetCode

Java BufferedReader

最后修改于 2024 年 1 月 27 日

Java BufferedReader 教程展示了如何使用 Java BufferedReader 提高文本文件的读取性能。Java 教程 是一个关于 Java 语言的全面教程。

缓冲输入流从称为缓冲区的内存区域读取数据。 只有当缓冲区为空时,才会调用原生输入 API。

对于非缓冲 I/O 流,每个读取请求都由底层操作系统直接处理。 这种效率要低得多,因为每个这样的请求通常会触发磁盘访问、网络活动或一些其他相对昂贵的操作。

Java BufferedReader

BufferedReader 从字符输入流读取文本,缓冲字符,以便提供高效地读取字符、数组和行。

可以指定缓冲区大小,也可以使用默认大小。 默认值对于大多数用途来说都足够大。

以下一些示例使用此文本文件

src/resources/thermopylae.txt
The Battle of Thermopylae was fought between an alliance of Greek city-states, 
led by King Leonidas of Sparta, and the Persian Empire of Xerxes I over the 
course of three days, during the second Persian invasion of Greece. 

Java BufferedReader 示例

在以下示例中,我们使用 BufferedReader 读取文本文件。 它与 FileReader 类一起使用。

注意: 过去,FileReader 依赖于平台的默认编码。 自 Java 11 以来,该问题已得到纠正。 现在可以显式指定编码。

com/zetcode/BufferedReaderEx.java
package com.zetcode;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class BufferedReaderEx {

    public static void main(String[] args) throws IOException {

        var fileName = "src/resources/thermopylae.txt";

        try (var br = new BufferedReader(new FileReader(fileName, StandardCharsets.UTF_8))) {

            String line;
            while ((line = br.readLine()) != null) {

                System.out.println(line);
            }
        }
    }
}

在该示例中,我们将 BufferedReaderFileReader 一起使用。

var fileName = "src/resources/thermopylae.txt";

我们指定文件名。

try (var br = new BufferedReader(new FileReader(fileName, StandardCharsets.UTF_8))) {

我们将 FileReader 包装到 BufferedReader 中,以提高其性能。

String line;
while ((line = br.readLine()) != null) {

    System.out.println(line);
}

readLine 读取一行文本。 它返回包含该行内容的字符串,不包括任何行终止字符,如果已到达流的末尾而没有读取任何字符,则返回 null

Java Files.newBufferedReader

Files.newBufferedReader 是一个方便的方法,它打开一个文件进行读取,返回一个 BufferedReader,可用于以高效的方式从文件中读取文本。 文件中的字节使用指定的字符集解码为字符。

com/zetcode/BufferedReaderEx2.java
package com.zetcode;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class BufferedReaderEx2 {

    public static void main(String[] args) throws IOException {

        var fileName = "src/resources/thermopylae.txt";
        var path = Paths.get(fileName);

        try (var br = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {

            String line;
            while ((line = br.readLine()) != null) {

                System.out.println(line);
            }
        }
    }
}

该示例读取 thermopylae.txt 文件,利用 Files.newBufferedReader 方法。

Java BufferedReader with InputStreamReader

以下示例将 BufferedReaderInputStreamReader 一起使用。 InputStreamReader 是从字节流到字符流的桥梁。 它读取字节并使用指定的字符集将它们解码为字符。

com/zetcode/BufferedReaderEx3.java
package com.zetcode;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class BufferedReaderEx3 {

    public static void main(String[] args) throws IOException {

        var urlPath = "http://webcode.me";
        var url = new URL(urlPath);

        try (var br = new BufferedReader(new InputStreamReader(url.openStream(),
                StandardCharsets.UTF_8))) {

            String line;
            while ((line = br.readLine()) != null) {

                System.out.println(line);
            }
        }
    }
}

该示例读取 webcode.me 网站的主页。

来源

Java BufferedReader - 语言参考

在本文中,我们使用了 Java BufferedReader。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程