跳转至

Java InputStreamReader教程

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

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

Java InputStreamReader

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

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

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

Java InputStreamReader文件流

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

russiantext.txt

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

我们有西里尔文文字。

JavaInputStreamReaderEx.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目录中的俄语小文本。

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

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: ");
            }
        }
    }
}

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

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

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

Java InputStreamReader URL 流

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

JavaInputStreamReaderEx3.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());
    }
}

该示例从网站读取文本。

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

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

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

JavaInputStreamReaderEx4.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 解析器对其进行解析。

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 InputStream教程用 Java 阅读文本文件Jsoup 教程Java 教程



回到顶部