java.io 包中包含了咱们跟 IO 打交道中必要的类和接口。IO 流可以分为输入流和输出流,也可以分为字节流(byte stream)和字符流(character stream)。只是划分的维度不一样而已。
Closeable 是一个接口,继承于 java.lang.AutoCloaseable 接口,close() 方法可能会抛出 IOException 异常。
InputStream 是所有输入字节流的父类。字节流表示它操作的对象是字节,与字节流对应的是字符流,Reader 是输入字符流的父类,咱们可以通过其 API 的设计看出区别。
FileInputStream 是一个常见的 InputStream 的直接子类。一般用来读取文件,也就是说把一个文件当成输入,以字节流的方式读取。
常见的用法是:
File file = ...
FileInputStream fis = new FileInputStream(file);
FileInputStream 有三个构造器
下面列出 FileInputStream 比 InputStream 增加的 API
字节数组输入流,把一个字节数组当成输入,以字节流的方式读取这个数组。
ObjectInputStream 是把一个 Java 对象当成一个输入。
ObjectInputStream 有丰富的 API,这里不具体罗列,因为咱们平时用的也不多。ObjectInputStream 一般与 ObjectOutputStream 配合使用,先通过 ObjectOutputStream 往流里写入数据,包括 Java 对象的成员变量的字段名字以及值。ObjectInputStream 在获取到流后,再以写入的反向顺序读取出来,还原出来 Java 对象。
可能的运用场景是对 Java 对象的保存,比如保存到文件中,再恢复的时候从文件中还原对象。另外一种是两个进程之间的对象传输,把 A 进程的 Java 对象传输到 B 进程。
pipe 一般翻译为管道,当两个线程(注意,是线程)需要传送数据的时候,一个创建管道输出流,一个创建管道输入流。
sequence 有按顺序排好的意思,SequenceInputStream 的作用是把两个或者多个 InputStream 按顺序读取。第一个 InputStream 读取结束了,接着读取第二个 InputStream。
LineNumberInputStream 的上级父类是 FilterInputStream,不是 InputStream 的直接子类。其作用是对其包裹的 InputStream 进行读行的计数,每当读到 '\r','\n' 和 '\r\n' 的时候,计数会加一。这个类在引入到 Android 的时候就被抛弃,建议使用 LineNumberReader 替代。
FilterInputStream 的子类,其作用是对其包裹的 InputStream 进行缓冲。缓冲带来的缺点就是占用了一定的空间。
InputStream 是字节流,每次 read 只能读取一个字节,或者一个字节数组,如果我们需要读取一个 int,那么就需要读取 4 个字节,然后再对其进行移位,最后得到一个 int,而 DataInputStream 则把这些操作封装好了。
- EOF -
本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动。
转载请注明:文章转载自 Binkery 技术博客 [https://binkery.com]
本文标题: Java IO 之 InputStream 输入字节流
本文地址: https://binkery.com/archives/552.html