我是Java IO, 你可能听说过我,了解过我,用我的API写过简单的程序, 但估计大部分人也就此打住, 对我的了解并不深入。
这也难怪,毕竟在实际的工作当中,直接使用我的API来操作文件的机会并不多, 更多时候你只需要把配置文件(xml, properties等)放到指定的位置, 剩下的工作就交给框架去处理了, 框架会把这些配置数据变成Java 对象来让你调用, 不用你去操心IO细节。
有些人以为我只是和文件打交道, 为什么不叫做File, 而叫做这么文绉绉的IO呢 ?
其实IO就是输入输出的意思, 文件只是一个IO的例子而已, 从网络读写数据也是IO啊, 极端的情况我对存读写数据也可以是IO啊。 IO是对他们的抽象。
还有人一直分不清什么时候用InputStream, 什么时候用OuputStream, 老是把他俩搞混, 我可以教你一个简单的方法: 把自己当成程序, 当你从外边读数据到自己这里就用InputStream, 向外边写数据就用OutputStream。
Stream这个词也很有意思,想象一下,你从文件/网络读取数据, 这些数据像河流一样“流”向你, 是不是很形象? 由于是“流”, 你读到了第100个字节, 然后想退回到第10个字节重新读, 那我是不允许的, 河流是不允许倒退的。
追根溯源, 计算机中的一切都是二进制的字节, 包括你现在正在看到的文章, 但是你们码农如果直接用InputStream/OutStream来读取这些文本内容, 势必有点麻烦,还得翻译成字符, 所以为了方便你们我就提供了Reader/Writer 接口, 专门用于处理字符流。
啰嗦的这么多, 还没到正题, 我想给大家说的是昨天发生的一件事。
昨天下午,我一边喝咖啡一边津津有味的欣赏我那优雅的API设计,每一次我都忍不住赞叹那漂亮的对称性(Input, Output对称, byte和char 对称), 还有这装饰模式和适配器模式, 多么优雅,多么漂亮 ,竟然有人说我过度设计, 真是不知好歹。
正在这时候有人敲门了, 来人自称是帝国语言管理部门的,戴着一副深度眼镜, 我们就称呼他“眼镜”吧。
我把他请进来,一起喝点咖啡, 顺便再炫耀下我这优雅的API。
不料眼镜说: “IO先生, 我奉上司命令, 特意前来帮你把API增强一下。”
我说: “现在已经这么优雅漂亮了, 你们还要改? 小心把它改丑了!”
“不是的, 我此次的目的主要是增强API, 你想想,你的接口有什么问题没有?”
我说:“除了有人说我过度设计之外,好像没什么呀”
“你不知道, 问题都反映到上层部门去了, 其中有个重要的问题就是阻塞的问题”
这个我知道, 比如我去读取文件中的一行数据: