ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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/)。