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

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

Java InputStreamReader

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

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

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

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 教程