1. 什么是流?
流是任意长度的字节序列。字节流从应用程序经过输出流到目的地,从数据源经过输入流进入应用程序。Java在java.io提供了用于标识各种不同流目的地的类和用于标识各种用于读入的源的类。
2 流类概述
Java中所有输出流都继承自OutputStream,所有输入流都继承自InputStream
image imageLineNumberInputStream类和 StringBufferInputStream类因为不支持编码已经废弃了。
除了上边包含的输入输出流类,java.util.zip包中也提供了压缩输出流和解压缩输入流类。java.util.jar包中也提供了用于从jar文件中读取和写入的类。
JarOutputStream
JarInputStream
3. OutputStream 和 InputStream
Java中提供了OutputStream和InputStream类用于描述可执行的I/O操作。
OutputStream类是所有输出流子类的父类,其提供的方法有:
方法 | 描述 |
---|---|
void close() | 关闭输出流自身,并释放与之有关的所有操作系统资源 |
void flush() | 将任何缓存的字节刷到目的地,如果要刷新的目的地是操纵系统提供的抽象层,如文件,那么此操作只能保证缓存被刷新到操作系统,并不能保证字节回被刷新到硬盘 |
void write(byte[] b) | 将从字节数组b中长度为b.length的字节写入到此输出流中 |
void write(byte[] b, int off, int len) | 将字节数组中偏移量为off,长度为len的字节写到输出流中 |
void write(int b) | 将字节b写到输出流中,只有低8位被写入,高位的24位被忽略 |
close方法回自动刷新outputstream,如果程序在close被调用前终止,output stream会被自动关闭,且数据将被刷新。
InputStream提供方法如下:
方法 | 描述 |
---|---|
int available() | 返回输入流中可读取的字节个数,此方法返回值不应该被用于分配缓存以容纳所有输入流中的数据,因为子类可能并不会返回所有数据大小 |
void close() | 关闭输入流,并释放任何与该流有关的操作系统资源 |
void mark(int readlimit) | 标记流的当前位置。之后的reset()方法调用会重新设置到该标记位置,以便于重读相同的字节。readlimit参数告诉输入流,在标记位置失效前,有多少字节能够被读取(如果读取的字节超过该参数,将不能使用reset方法重置,事实上子类的实现可能并不遵循该规则) |
boolean markSupported() | 输入流是否支持mark操作 |
int read() | 读取一个字节,并作为整数返回,如果已经到了尾部,将返回-1。此方法将会阻塞,直到有数据可读或者异常抛出为止。 |
int read(byte[] b) | 读取字节并将它们存储到数组b中,返回读取的字节数量。方法阻塞 |
int read(byte[] b, int off, int len) | 读取不超过len个字节,并将它们存储到数组b中,起始偏移量位off,方法阻塞。 |
void reset() | 重置到上次mark的地址,如果没有执行过mark方法或者mark位置失效,将抛出异常 |
long skip(long n) | 跳过n个字节。返回实际被跳过的字节数量 |
网友评论