其实IO里按照 输出/输出 字节流/字符流 的可以分为四类
-
OutputStream: 代表一个输出字节流
-
InputStream: 代表一个输入字节流
-
Writer: 代表一个输出字符流
-
Reader: 代表一个输入字节流
至于字节流和字符流的区别, 字节流内部使用byte[]存储流数据, 字符流使用char[]存储流数据
至于什么是流, 流就是一个水管, 一头进一头出
那么我们怎么控制这个管道的出入呢, 比如OutputStream, 管道入的东西我们通过代码控制, 具体来说就是write函数:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
水管出的方向我们也可以指定, 例如一个文件/字节数组等
编辑
添加图片注释,不超过 140 字(可选)
当然只能通过write(byte[])的方式难免效率太低, 想要自己写入个字符串都要通过先转换成字节数组
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑
添加图片注释,不超过 140 字(可选)
这写代码太麻烦了, 所以Java提供了一堆装饰类(参考设计模式的装饰模式)来提供额外的功能
编辑切换为居中
添加图片注释,不超过 140 字(可选)
例如PrintStream就是把一个输出流OutputStream装饰起来并提供适合输出字符串的print方法, System.out就是PrintStream类型的
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
现在就可以直接通过print的方式向OutputStream流之中写入字符串了
编辑切换为居中
添加图片注释,不超过 140 字(可选)
其他的装饰类也提供了相应的功能, 例如DateOutputStream提供了一堆将各种类型转换为字节流的方法
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑
添加图片注释,不超过 140 字(可选)
BufferedOutputStream虽然没增加额外的方法接口, 但是内部增加了一个缓冲(就是byte[]), 可以减少write的次数
编辑切换为居中
添加图片注释,不超过 140 字(可选)
FilterOutputStream 的一堆子类外, ObjectOutputStream也算是装饰类, 它提供了序列化Java对象的方法
编辑切换为居中
添加图片注释,不超过 140 字(可选)
至于Reader,Writer, InputStream这些 其实都差不多, 只不过方向或者传输的数据不一样, 还是可以分为两种的, 一种是像FileOutputStream对应一个具体目的地的, 另一种是将一个流装饰起来提供额外的功能, 例如PrintStream
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)