OutputStream是输出流的抽象,它是将程序内存中的数据写入到目的地(也就是接收数据的一端)。看下类的签名:
1public abstract class OutputStream implements Closeable, Flushable {}提供了基础方法相比输入流来说简单多了,主要就是write写方法(几种重载的方法)、flush冲刷和close关闭。
1// 写出一个字节的数据2abstract void write(int n)
3
4// 写出字节到数据b
5void write(byte[] b)
6
7// 写出字节到数组b,off:代表第一个写出字节在b中的偏移量,len:写出字节的最大数量
8void write(byte[] b, int off, int len)
9
10//冲刷输出流,也就是将所有缓冲的数据发送到目的地
11void flush()
12
13// 关闭输出流
14void close()
15
同样地,OutputStream也提供了一些基础流的实现,这些实现也可以和特定的目的地(接收端)对应起来,比如输出到字节数组或者是输出到文件/管道等。
类 功能ByteArrayOutputStream 在内存中创建一个缓冲区,所有送往“流”的数据都要放在此缓冲区
FileOutputStream 将数据写入文件
PipedOutputStream 和PipedInputStream配合使用。实现管道化
FilterOutputStream 抽象类,主要是作为“装饰器”的接口类,实现其他的功能流
使用装饰器包装有用的流
Java IO 流体系使用了装饰器模式来给哪些基础的输入/输出流添加额外的功能。这写额外的功能可能是:可以将流缓冲起来提高性能、是流能够读写基本数据类型等。
这些通过装饰器模式添加功能的流类型都是从FilterInputStream和FilterOutputStream抽象类扩展而来的。可以再返回文章最开始说到IO流体系的层次时,那几种图加深下印象。
FilterInputStream类型
类 功能DataInputStream 和DataOutputStream搭配使用,使得流可以读取int char long等基本数据类型
BufferedInputStream 使用缓冲区,主要是提高性能
LineNumberInputStream 跟踪输入流中的行号,可以使用getLineNumber、setLineNumber(int)
PushbackInputStream 使得流能弹出“一个字节的缓冲区”,可以将读到的最后一个字符回退
FilterOutStream类型
类 功能DataOutputStream 和DataInputStream搭配使用,使得流可以写入int char long等基本数据类型
PrintStream 用于产生格式化的输出
BufferedOutputStream 使用缓冲区,可以调用flush()清空缓冲区
大多数情况下,其实我们在使用流的时候都是输入流和输出流搭配使用的。目的就是为了转移和存储数据,单独的read()对我们而言有啥用呢,读出来一个字节能干啥?对吧。因此要理解流的使用就是搭配起来或者使用功能流组合起来去转移或者存储数据。
Reader和WriterReader是Java IO中所有Reader的基类。Reader与InputStream类似,不同点在于,Reader基于字符而非基于字节。
Writer是Java IO中所有Writer的基类。与Reader和InputStream的关系类似,Writer基于字符而非基于字节,Writer用于写入文本,OutputStream用于写入字节。
Reader和Writer的基础功能类,可以对比InputStream、OutputStream来学习。
面向字节 面向字符InputStream Reader
OutputStream Writer
FileInputStream FileReader
FileOutputStream FileWriter
ByteArrayInputStream CharArrayReader
ByteArrayOutputStream CharArrayWriter
PipedInputStream PipedReader
PipedOutputStream PipedWriter
StringBufferInputStream(已弃用) StringReader
无对应类 StringWriter