# Java `InputStreamReader`教程

原文：http://zetcode.com/java/inputstreamreader/

Java `InputStreamReader`教程显示了如何使用 Java `InputStreamReader`来读取 Java 中的文本。

## Java `InputStreamReader`

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

建议将`InputStreamReader`包裹在`BufferedReader`中以获得最佳效率。

请注意，在 Java 中使用字符流时，应避免使用依赖于默认编码的流，例如`FileReader`或`PrintWriter`。

## Java `InputStreamReader`文件流

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

`russiantext.txt`

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

```

我们有西里尔文文字。

`JavaInputStreamReaderEx.java`

```java
package com.zetcode;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class JavaInputStreamReaderEx {

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

        String fileName = "src/main/resources/russiantext.txt";

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

            String line;

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

```

该示例读取位于`src/main/resources`目录中的俄语小文本。

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

```

`FileInputStream`用于创建文件流。 `FileInputStream`包装在`InputStreamReader`中，用于读取文本数据。 我们设置`StandardCharsets.UTF_8`编码。 最后，为了获得最佳效率，将`InputStreamReader`包装到`BufferedReader`中。

## Java `InputStreamReader`标准输入流

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

`JavaInputStreamReaderEx2.java`

```java
package com.zetcode;

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

public class JavaInputStreamReaderEx2 {

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

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

            String line;

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

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

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

```

该示例显示提示并等待用户的响应。 程序在收到正确的输入后结束。

```java
try (BufferedReader bin
        = new BufferedReader(new InputStreamReader(System.in))) {

```

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

## Java `InputStreamReader` URL 流

下面的示例使用`InputStreamReader`从网络流中读取文本。

`JavaInputStreamReaderEx3.java`

```java
package com.zetcode;

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

public class JavaInputStreamReaderEx3 {

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

        StringBuilder sb;

        URL url = new URL("http://www.something.com");

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

            String line;

            sb = new StringBuilder();

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

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

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

```

该示例从网站读取文本。

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

```

该示例从指定的 URL 打开流。 它从`something.com`网页读取 HTML 代码。

下一个示例调用 Alexa Web 服务来确定网站的排名。

`JavaInputStreamReaderEx4.java`

```java
package com.zetcode;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class JavaInputStreamReaderEx4 {

    public static void main(String[] args) throws MalformedURLException,
            IOException, ParserConfigurationException, SAXException {

        String webSite = "www.something.com";

        int ranking = 0;

        String url = String.format("http://data.alexa.com/data?cli=10&url=%s", 
                webSite);

        URLConnection conn = new URL(url).openConnection();

        try (InputStream is = conn.getInputStream()) {

            DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                    .newDocumentBuilder();

            Document doc = builder.parse(is);

            Element element = doc.getDocumentElement();

            NodeList nodeList = element.getElementsByTagName("POPULARITY");

            if (nodeList.getLength() > 0) {

                Element elementAttribute = (Element) nodeList.item(0);

                ranking = Integer.valueOf(elementAttribute.getAttribute("TEXT"));
            }
        }

        System.out.printf("Ranking of %s: %d%n", webSite, ranking);
    }
}

```

该示例接收 XML 输入，并使用 Java DOM 解析器对其进行解析。

```java
NodeList nodeList = element.getElementsByTagName("POPULARITY");

if (nodeList.getLength() > 0) {

    Element elementAttribute = (Element) nodeList.item(0);

    ranking = Integer.valueOf(elementAttribute.getAttribute("TEXT"));
}

```

该排名在`POPULARITY`标签的`TEXT`属性中可用。

在本教程中，我们展示了如何使用 Java `InputStreamReader`来读取 Java 中的文本。 您可能也对相关教程感兴趣： [Java `FileInputStream`教程](/java/fileinputstream/)， [Java `InputStream`教程](/java/inputstream/)，[用 Java 阅读文本文件](/articles/javareadtext/)， [Jsoup 教程](/java/jsoup/) 和 [Java 教程](/lang/java/)。