定义
输入流:可以从其中读取一个字节序列
从你的角度看,你能从输入流中获得你想要的数据
你可以从奶牛获取奶,但是获取的同时你不能给予(再把奶塞回去)
输出流:可以写入一个字节序列的对象
而输出流就是你把你的数据写到想要的位置(可能远程的计算机,本地的文本文件...)
同样的,写入的同时不能读取
特点:
- 数据先进先出
- 顺序存取
- 流具有单向性,一个流要么只读要么只写(因为要么实现了read()要么实现了write()方法)
请注意! IO流是一个用来传输数据的对象
任何继承自Reader或者InputStream的方法都有read()方法,相应的,所有继承自Writer/OutputStream都有write()方法.InputStream/OutputStream的reader()/wirte()用来读取一个字节的数据.那么问题就来了(想想因为啥).
一开始(jdk1.0)呢,是只有InputStream/OutputStream的,但因为各个地区编码不同,比如说中文的有些汉字需要两个字节存,只用InputStream/OutputStream的话而且不指定编码方式会出现乱码问题,所以引入了Reader/Writer类.保证java程序在IO操作中支持unicode.
但是InputStream/OutputStream虽然有一些缺陷,但它仍是无可替代的,因为有些情况下只能通过读取字节的方式获取数据(比如压缩文件).
普及一个小知识:
装饰者模式:
允许向一个现有对象添加新功能但又不改变类结构.
在java的IO流中的具体体现就是它的流能跟俄罗斯套娃一样一层套一层来获得有多个功能的对象实例.
同学们之所以认为java的io流难学无非以下几点:
- 类真吉尔多(好家伙快二十多个了)
- 类本来就够花里胡哨了,还能一个套一个,但这也是java IO流的强大之处(随心所欲的使用意味着学习代价的上升)
加油!