ZetCode

Java InputStreamReader

上次修改时间:2024 年 3 月 3 日

在本文中,我们将展示如何使用 Java InputStreamReader 在 Java 中读取文本。

JavaInputStreamReader 是字节流和字符流之间的桥梁。 它读取字节,并使用指定的字符集将它们解码为字符。

建议将 InputStreamReader 封装在 BufferedReader 中,以获得最佳效率。

请注意,在 Java 中处理字符流时,我们应该避免使用依赖于默认编码的流,例如 FileReaderPrintWriter

从 FileInputStream 读取

在第一个示例中,我们使用 InputStreamReader 从文件流中读取文本。

russian-text.txt
Пе́рвая мирова́я война́ (28 июля 1914 — 11 ноября 1918) — один
из самых широкомасштабных вооружённых конфликтов в истории человечества.
Формальным поводом к войне послужили события в Сараеве,
где 28 июня 1914 года девятнадцатилетний боснийский серб, студент
Гаврило Принцип осуществил покушение, в результате которого был убит
австрийский эрцгерцог Франц Фердинанд и его морганатическая жена София Хотек.

我们有一段西里尔文的文本。

Main.java
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

void main() throws Exception {

    String fileName = "russian-text.txt";

    try (var fis = new FileInputStream(fileName);
            var isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
            var br = new BufferedReader(isr)) {

        String line;

        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
}

该示例读取一段俄语文本。

try (var fis = new FileInputStream(fileName);
        var isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
        var br = new BufferedReader(isr)) {

使用 FileInputStream 创建文件流。 FileInputStream 被封装到 InputStreamReader 中以读取文本数据。 我们设置 StandardCharsets.UTF_8 编码。 最后,InputStreamReader 被封装到 BufferedReader 中以获得最佳效率。

从标准输入流读取

第二个示例使用 InputStreamReader 从标准输入流中读取文本。

Main.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

void main() throws IOException {

    try (var br = new BufferedReader(new InputStreamReader(System.in,
                    StandardCharsets.UTF_8))) {

        String line;
        System.out.print("Give me a cookie: ");

        while (!(("cookie").equals(line = br.readLine()))) {

            System.out.println(line);
            System.out.print("Give me a cookie: ");
        }
    }
}

该示例打印一个提示,并等待用户的响应。 当程序接收到正确的输入时,程序结束。

try (var br = new BufferedReader(new InputStreamReader(System.in,
                StandardCharsets.UTF_8))) {

我们使用 System.in 从标准输入读取。

从 URL 流读取

以下示例使用 InputStreamReader 从网络流读取文本。

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

void main() throws IOException {

    var url = URI.create("https://www.webcode.me").toURL();

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

        String line;
        var sb = new StringBuilder();

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

            sb.append(line);
            sb.append(System.lineSeparator());
        }

        System.out.println(sb.toString());
    }
}

该示例从网站读取文本。

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

该示例从指定的 URL 打开一个流。 它从 webcode.me 网页读取 HTML 代码。

来源

Java InputStreamReader - 语言参考

在本文中,我们展示了如何使用 Java InputStreamReader 在 Java 中读取文本。

作者

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

列出所有Java教程