原文:http://zetcode.com/java/inputstreamreader/
Java InputStreamReader
教程显示了如何使用 Java InputStreamReader
来读取 Java 中的文本。
Java InputStreamReader
JavaInputStreamReader
是字节流和字符流之间的桥梁。 它读取字节,并使用指定的字符集将其解码为字符。
建议将InputStreamReader
包裹在BufferedReader
中以获得最佳效率。
请注意,在 Java 中使用字符流时,应避免使用依赖于默认编码的流,例如FileReader
或PrintWriter
。
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 教程。