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

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

Java InputStreamReader

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

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

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

Java InputStreamReader文件流

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

russiantext.txt

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

我们有西里尔文文字。

JavaInputStreamReaderEx.java

  1. package com.zetcode;
  2. import java.io.BufferedReader;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.nio.charset.Charset;
  8. import java.nio.charset.StandardCharsets;
  9. public class JavaInputStreamReaderEx {
  10. public static void main(String[] args) throws FileNotFoundException, IOException {
  11. String fileName = "src/main/resources/russiantext.txt";
  12. try (FileInputStream fis = new FileInputStream(fileName);
  13. InputStreamReader isr = new InputStreamReader(fis,
  14. StandardCharsets.UTF_8);
  15. BufferedReader br = new BufferedReader(isr)) {
  16. String line;
  17. while ((line = br.readLine()) != null) {
  18. System.out.println(line);
  19. }
  20. }
  21. }
  22. }

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

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

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

Java InputStreamReader标准输入流

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

JavaInputStreamReaderEx2.java

  1. package com.zetcode;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.nio.charset.StandardCharsets;
  6. public class JavaInputStreamReaderEx2 {
  7. public static void main(String[] args) throws IOException {
  8. try (BufferedReader bin
  9. = new BufferedReader(new InputStreamReader(System.in,
  10. StandardCharsets.UTF_8))) {
  11. String line;
  12. System.out.print("Give me a cookie: ");
  13. while (!(("cookie").equals(line = bin.readLine()))) {
  14. System.out.println(line);
  15. System.out.print("Give me a cookie: ");
  16. }
  17. }
  18. }
  19. }

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

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

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

Java InputStreamReader URL 流

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

JavaInputStreamReaderEx3.java

  1. package com.zetcode;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.MalformedURLException;
  6. import java.net.URL;
  7. import java.nio.charset.StandardCharsets;
  8. public class JavaInputStreamReaderEx3 {
  9. public static void main(String[] args) throws MalformedURLException, IOException {
  10. StringBuilder sb;
  11. URL url = new URL("http://www.something.com");
  12. try (InputStreamReader isr = new InputStreamReader(url.openStream(),
  13. StandardCharsets.UTF_8);
  14. BufferedReader br = new BufferedReader(isr)) {
  15. String line;
  16. sb = new StringBuilder();
  17. while ((line = br.readLine()) != null) {
  18. sb.append(line);
  19. sb.append(System.lineSeparator());
  20. }
  21. }
  22. System.out.println(sb.toString());
  23. }
  24. }

该示例从网站读取文本。

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

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

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

JavaInputStreamReaderEx4.java

  1. package com.zetcode;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.net.MalformedURLException;
  5. import java.net.URL;
  6. import java.net.URLConnection;
  7. import javax.xml.parsers.DocumentBuilder;
  8. import javax.xml.parsers.DocumentBuilderFactory;
  9. import javax.xml.parsers.ParserConfigurationException;
  10. import org.w3c.dom.Document;
  11. import org.w3c.dom.Element;
  12. import org.w3c.dom.NodeList;
  13. import org.xml.sax.SAXException;
  14. public class JavaInputStreamReaderEx4 {
  15. public static void main(String[] args) throws MalformedURLException,
  16. IOException, ParserConfigurationException, SAXException {
  17. String webSite = "www.something.com";
  18. int ranking = 0;
  19. String url = String.format("http://data.alexa.com/data?cli=10&url=%s",
  20. webSite);
  21. URLConnection conn = new URL(url).openConnection();
  22. try (InputStream is = conn.getInputStream()) {
  23. DocumentBuilder builder = DocumentBuilderFactory.newInstance()
  24. .newDocumentBuilder();
  25. Document doc = builder.parse(is);
  26. Element element = doc.getDocumentElement();
  27. NodeList nodeList = element.getElementsByTagName("POPULARITY");
  28. if (nodeList.getLength() > 0) {
  29. Element elementAttribute = (Element) nodeList.item(0);
  30. ranking = Integer.valueOf(elementAttribute.getAttribute("TEXT"));
  31. }
  32. }
  33. System.out.printf("Ranking of %s: %d%n", webSite, ranking);
  34. }
  35. }

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

  1. NodeList nodeList = element.getElementsByTagName("POPULARITY");
  2. if (nodeList.getLength() > 0) {
  3. Element elementAttribute = (Element) nodeList.item(0);
  4. ranking = Integer.valueOf(elementAttribute.getAttribute("TEXT"));
  5. }

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

在本教程中,我们展示了如何使用 Java InputStreamReader来读取 Java 中的文本。 您可能也对相关教程感兴趣: Java FileInputStream教程, Java InputStream教程,用 Java 阅读文本文件, Jsoup 教程 和 Java 教程。