原文:http://zetcode.com/java/inputstream/
Java InputStream教程显示了如何使用 Java 中的InputStream类。
Java 流是来自源或目的地的数据流。 Java 流的一个很好的比喻是水从水龙头流入浴缸,然后又流入排水装置。 InputStream和OutputStream是对数据(例如 C 文件指针)的低级访问的抽象。
Java InputStream
InputStream是读取数据的源。 流可以表示各种类型的源,包括磁盘文件,设备,其他程序和内存数组。
流支持许多不同类型的数据,包括简单字节,原始数据类型,本地化字符和对象。
Java InputStream子类
InputStream是一个抽象类; 它是表示字节输入流的所有类的超类,包括AudioInputStream,ByteArrayInputStream,FileInputStream,FilterInputStream,ObjectInputStream,PipedInputStream和SequenceInputStream。
Java InputStream关闭
FileInputStream的close()方法关闭输入流,并释放与此流关联的所有系统资源。 在我们的示例中,我们使用try-with-resources语句,该语句确保在语句末尾关闭每个资源。
Java InputStream读取
InputStream使用以下读取方法读取字节:
read(byte[] b)- 从此输入流中读取最多b.length个字节的数据到一个字节数组中。read(byte[] b, int off, int len)- 从此输入流中读取最多len个字节的数据到一个字节数组中。read()- 从文件输入流中读取一个字节。
Java InputStream读取文本
以下示例显示如何使用InputStream读取文本文件。
thermopylae.txt
The Battle of Thermopylae was fought between an alliance of Greek city-states,led by King Leonidas of Sparta, and the Persian Empire of Xerxes I over thecourse of three days, during the second Persian invasion of Greece.
在示例中,我们使用此文本文件。
JavaInputStreamText.java
package com.zetcode;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.nio.charset.StandardCharsets;public class JavaInputStreamText {public static void main(String[] args) throws IOException {String fileName = "src/resources/thermopylae.txt";try (InputStream fis = new FileInputStream(fileName);InputStreamReader isr = new InputStreamReader(fis,StandardCharsets.UTF_8);BufferedReader br = new BufferedReader(isr)) {br.lines().forEach(line -> System.out.println(line));}}}
使用FileInputStream,InputStreamReader和BufferedReader读取文本文件。
try (InputStream fis = new FileInputStream(fileName);
FileInputStream是InputStream的一种特殊形式,用于从文件中读取字节。
InputStreamReader isr = new InputStreamReader(fis,StandardCharsets.UTF_8);
InputStreamReader是从字节流到字符流的桥梁:它读取字节,并使用指定的字符集将其解码为字符。
BufferedReader br = new BufferedReader(isr)) {
BufferedReader从字符输入流中读取文本,缓冲字符以有效读取字符,数组和行。
br.lines().forEach(line -> System.out.println(line));
从缓冲读取器中按行读取数据。
Java InputStream读取字节
InputStream的读取方法读取字节。
JavaInputStreamBytes.java
package com.zetcode;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class JavaInputStreamBytes {public static void main(String[] args) throws IOException {String fileName = "src/resources/ball.png";try (InputStream is = new FileInputStream(fileName)) {byte[] buffer = new byte[is.available()];is.read(buffer);int i = 0;for (byte b: buffer) {if (i % 10 == 0) {System.out.println();}System.out.printf("%02x ", b);i++;}}System.out.println();}}
该示例从 PNG 图像读取字节,并将字节以十六进制格式打印到控制台。
try (InputStream is = new FileInputStream(fileName)) {
我们使用FileInputStream从图像文件中读取字节。
byte[] buffer = new byte[is.available()];is.read(buffer);
使用read()方法,我们将字节读入字节数组。
int i = 0;for (byte b: buffer) {if (i % 10 == 0) {System.out.println();}System.out.printf("%02x ", b);i++;}
我们遍历数组并将字节以十六进制格式打印到控制台。
89 50 4e 47 0d 0a 1a 0a 00 0000 0d 49 48 44 52 00 00 00 0a00 00 00 0a 08 06 00 00 00 8d32 cf bd 00 00 00 04 73 42 4954 08 08 08 08 7c 08 64 88 0000 00 09 70 48 59 73 00 00 0dd7 00 00 0d d7 01 42 28 9b 7800 00 00 19 74 45 58 74 53 6f...
这是示例的部分示例输出。
从 URL 读取 Java InputStream
InputStream允许从 URL 源读取数据。
JavaInputStreamURL.java
package com.zetcode;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;public class JavaInputStreamURL {public static void main(String[] args) throws IOException {String webSite = "http://www.something.com";URL url = new URL(webSite);try (InputStream is = url.openStream();BufferedReader br = new BufferedReader(new InputStreamReader(is))) {br.lines().forEach(System.out::println);}}}
该示例将InputStream打开到网页并读取其数据。
try (InputStream is = url.openStream();
使用openStream()方法创建 URL 的InputStream。
<html><head><title>Something.</title></head><body>Something.</body></html>
这是输出。
Java InputStream读取反序列化的数据
ObjectInputStream读取先前使用ObjectOutputStream写入的序列化数据。
Country.java
package com.zetcode;import java.io.Serializable;public class Country implements Serializable {static final long serialVersionUID = 42L;private String name;private int population;public Country(String name, int population) {this.name = name;this.population = population;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPopulation() {return population;}public void setPopulation(int population) {this.population = population;}}
这是Country bean。 我们将序列化和反序列化国家列表。
JavaObjectOutputStreamEx.java
package com.zetcode;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;public class JavaObjectOutputStreamEx {public static void main(String[] args) throws IOException {String fileName = "src/resources/myfile.dat";try (OutputStream fis = new FileOutputStream(fileName);ObjectOutputStream out = new ObjectOutputStream(fis)) {List<Country> countries = new ArrayList<>();countries.add(new Country("Slovakia", 5429000));countries.add(new Country("Norway", 5271000));countries.add(new Country("Croatia", 4225000));countries.add(new Country("Russia", 143439000));out.writeObject(countries);}}}
该示例序列化对象列表。
out.writeObject(countries);
国家列表被写入ObjectOutputStream。
JavaInputStreamObjects.java
package com.zetcode;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.util.List;public class JavaInputStreamObjects {public static void main(String[] args) throws IOException, ClassNotFoundException {String fileName = "src/resources/myfile.dat";try (InputStream fis = new FileInputStream(fileName);ObjectInputStream oin = new ObjectInputStream(fis)) {List<Country> countries = (List<Country>) oin.readObject();countries.forEach(System.out::println);}}}
我们使用ObjectInputStream读取序列化的数据。
Java InputStream读取流序列
SequenceInputStream代表一系列输入流。 它允许从多个有序流中读取。
JavaInputStreamSequence.java
package com.zetcode;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.SequenceInputStream;public class JavaInputStreamSequence {public static void main(String[] args) throws IOException {String fileName1 = "src/resources/myfile.txt";String fileName2 = "src/resources/myfile1.txt";String fileName3 = "src/resources/myfile2.txt";try (InputStream is1 = new FileInputStream(fileName1);InputStream is2 = new FileInputStream(fileName2);InputStream is3 = new FileInputStream(fileName3);SequenceInputStream sis1 = new SequenceInputStream(is1, is2);SequenceInputStream sis = new SequenceInputStream(sis1, is3)) {int b = sis.read();while (b != -1) {System.out.printf("%c", b);b = sis.read();}System.out.println();}}}
该示例从三个FileInputStreams中读取。
try (InputStream is1 = new FileInputStream(fileName1);InputStream is2 = new FileInputStream(fileName2);InputStream is3 = new FileInputStream(fileName3);SequenceInputStream sis1 = new SequenceInputStream(is1, is2);SequenceInputStream sis = new SequenceInputStream(sis1, is3)) {
我们定义了三个输入流,并将这些流放入SequenceInputStreams中。
int b = sis.read();while (b != -1) {System.out.printf("%c", b);b = sis.read();}
我们使用read()从流中读取数据。
在本教程中,我们介绍了 Java InputStream类。 您可能也对相关教程感兴趣: Java InputStreamReader教程, Java FileOutputStream教程, Java FileInputStream教程, Java 文件时间, Java FileWriter教程, Java 附加到文件,用 Java 读取文本文件和 Java 教程。
