1. 输入/输出流

输入流:可以从其中读入一个字节序列的对象。

输出流:可以向其中写入一个字节序列的对象。

输入/输出流与上一章的“流”毫无关系。

抽象类InputStream与OutputStream构成了输入/输出(I/O)类层次结构的基础。

1) 读写字节

InputStream有一个抽象方法read:

abstract int read()

read将读入一个字节,并返回读入的字节值(0~255),或者在遇到输入源结尾时返回-1。

设计具体的输入流类时,设计者重写read以提供相应功能,例如,在FileInputStream类中,read将从某个文件中读入一个字节。

InputStream还有若干非抽象方法,如读入一个字节数组、跳过一些字节等,方法readAllBytes(Java 9)用以读取流中的所有字节:

byte[] bytes = in.readAllBytes();

OutputStream有一个抽象方法write:

abstract void write(int b)

write将写出一个字节,如果有一个 byte[],可以一次性地写出它们:

byte[] bytes = ...;
out.write(bytes);

方法transferTo:将所有字节从一个输入流传递到一个输出流。

/*transferTo的使用*/
in.transferTo(out);

read与write在调用时都将阻塞,直至字节被读入或写出,这意味着如果流无法立即访问,当前线程将被阻塞,使得在等待流可访问的时间里,其他线程有机会运行。