Java IO Streams 是既可以从中读取也可以向其写入的数据流。正如 Java IO 基础 之 概述(Overview)所述,Streams 通常会与数据源、数据流向目的地相关联,比如文件、网络连接等。

阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
七日书摘官方群.jpg

流不能像数组那样通过索引读写数据,也不能像使用 RandomAccessFile 那样在流中来回移动读写数据。流仅只是一个连续的数据流。

某些流实现了类似 PushbackInputStream 的特性允许你将数据重新推回到流中,以便后续重新读取。但你只能把有限的数据推回流中,并且你不能像操作数组那样随意读取,流中的数据只能够被顺序访问。

Java IO 流通常基于字节或者基于字符。字节流通常以 “stream” 命名,比如 InputStream 和 OutputStream。这些流一次读写一个原始字节,但 DataInputStream 和DataOutputStream 除外,它们还能够读写 int, long, float 和 double 类型的值。

字符流通常以 “Reader” 或者 “Writer” 命名。字符流能够读写字符(比如 Latin1 或者 Unicode 字符)。有关字符流输入和输出的更多信息,请参阅文本Java Readers和writer。

InputStream

java.io.InputStream 类是 Java IO 所有输入流的基类。如果你正在编写一个需要从流中读取数据的组件,请在组件中尝试使用 InputStream ,而不是依赖它的任何子类(比如 FileInputStream )。这样做能够让你的代码兼容所有类型的输入流,而不仅仅是某种具体类型的输入流。

然而,总是依赖 InputStream 并不能解决所有问题。如果你需要将读过的数据推回到流中,你必须使用 PushbackInputStream ,这就意味着你的流变量只能是这个类型,否则在代码中就不能调用 PushbackInputStream 的 unread() 方法。

通常使用输入流中的read()方法读取数据。read()方法返回一个整数,代表了读取到的字节的内容(译者注:0 ~ 255)。当达到流末尾没有更多数据可以读取的时候,read()方法返回-1。

通常通过 read() 方法从 InputStream 中读取数据。read() 方法返回一个整数,代表读取到的字节内容。如果达到流末尾没有更多数据要读取的时候,read() 方法通常返回 -1;否则,返回 0。

简单示例如下:

InputStream input = new FileInputStream("c:\\data\\input-file.txt");

int data = input.read();

while(data != -1){
  data = input.read();
}

OutputStream

java.io.OutputStream 类是 Java IO 所有输出流的基类。如果你正在编写一个需要将数据写入流中的组件,请在组件中尝试使用 OutputStream 替代它的所有子类。

以下是一个将某些数据推送到文件中的简单示例:

OutputStream output = new FileOutputStream("c:\\data\\output-file.txt");
output.write("Hello World".getBytes());
output.close();

Combining Streams

你可以将流组合起来以便实现更高级的输入和输出操作。例如,从文件中一次读取一个字节的速度是很慢的,因此可以从磁盘中一次读取一大块数据,然后从读到的数据块中获取字节。为了实现缓冲,可以把 InputStream 包装到 BufferedInputStream 中。
示例如下:

InputStream input = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"));

...

缓冲同样也可以应用于 OutputStream ,你可以实现将大块数据批量地写入到磁盘(或者相应的流)中,这个功能可以通过 BufferedOutputStream 实现。

缓冲只是通过组合流实现的其中一个效果。你还可以把 InputStream 包装到 PushbackInputStream 中,之后可以将读取过的数据推回到流中重新读取,在解析过程中有时候这样做很方便。或者,你也可以将两个 InputStream 整合成一个 SequenceInputStream。

通过将输入和输出流组合成链,还可以实现更多的效果。你甚至可以编写自定义的 Streams 类来包装 Java IO 提供的标准 Streams 类,这样你可以创建自己的效果或过滤器。

英文原文链接:http://tutorials.jenkov.com/java-io/streams.html

------完------

推荐阅读:

Java IO 基础 之 概述(Overview)

Java IO 基础 之 文件(Files)

Java NIO 简明教程

更多学习讨论欢迎进入七日书摘官方群: 七日书摘官方群

七日书摘官方群群聊二维码.png

参考资料:
https://blog.csdn.net/i_am_kop/article/details/78513802
http://ifeve.com/java-io-%e6%b5%81/