如果单独讲IO的底层知识,可能需要一本书,本系列文章是结合java 封装完成的api,循序渐进的讲述java中IO的编码方式,没有面面俱到,更多的是从大方面介绍,先给大家一个完整的整体认知
IO的基本类型:
磁盘IO:从磁盘读写文件,对java来说,主要是使用java.io包下的封装好的api
网络IO:网络程序从socket缓冲区读写内容的过程,使用的是java.net包下的封装好的socket api
接下来一图胜千文:java传统IO的包结构
![97b6cf298b4d5045a3d061de4396b5d3.png](https://i-blog.csdnimg.cn/blog_migrate/388de30476e2ad5ad62449af183897e7.jpeg)
java IO思维图--按照操作对象
【说明】我们看java io的类体系实在太多,几十个派生类,还有很多其他第三方扩展的,但是从操作对象来说,可以分为两类:字符流和字节流,是不是还是很晕?看看下面的代码
//新建测试文本文件,注意不要超过1024个字节File file = new File("/Users/test.txt");//读取方式一:字节流api读取文件内容InputStream fileInpuStream = new FileInputStream(file);byte[] byteArray = new byte[1024];//读取文件内容到字节数组,并且返回读取到字节数组的长度int len = fileInpuStream.read(byteArray);System.out.println("字节流读取文件内容:" + new String(byteArray,0,len));fileInpuStream.close();//读取方式一结束========//读取方式二:字符流api读取文件内容Reader fileReader = new FileReader(file);char[] charArray = new char[1024];int charLen = fileReader.read(charArray);System.out.println("字节流读取文件内容:" + new String(charArray,0,charLen));//读取方式二结束========
是不是有点感觉了?发现既可以用字节流的api读取文件,也可以用字符流的api读取数组,这两者的区别在哪里呢,记住下面表格的内容:
![5dbf8d2976fb9588531496ec5027e2ea.png](https://i-blog.csdnimg.cn/blog_migrate/d53cc6b2c6629eb4b1527ccb95d8cd5d.jpeg)
没完呢,继续==============我是分割线========================
再来看一张图,从另外一个维度看看输入输出流
![22ee1579a816ad67489322ccaf93ffac.png](https://i-blog.csdnimg.cn/blog_migrate/13b201278bad6265c0328333c8617960.jpeg)
java IO 节点流和处理流维度
【说明】这张图比第一张图多了左边的部分,节点流和处理流两个维度。最熟悉的BufferedInputStream是字节流,也是处理流;FileInputStream是字节流也是节点流。
节点流类型:可以从或者向一个特定的地点或者节点读写数据
处理流类型:对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写,处理流的构造方法总是要带一个其他流对象作为参数,一个流对象进过其他流的多次包装,叫做流的链接
处理流可以简单理解成经过装饰的流。
这里就引出了一个大家最喜欢的设计模式:装饰者模式
![16825c0f40439e29c32179da4bb988a6.png](https://i-blog.csdnimg.cn/blog_migrate/93443d819d87304a10208dbeb97254e2.jpeg)
装饰者模式类图
【说明】最下面的装饰类ConcreteDecorator1和2通过构造方法传入了Iparent类型的对象可以Iparent的实现类(如ParentImpl)的基础上扩展Iparent的功能,增加定义的extOperation方法,这个设计模式比通过继承类来扩展功能更灵活,有点组合复用的思想。
好了,见证奇迹的时刻到了,看一下BufferdInputStream的类图吧
![a15339a8d404a9c3267fadf0cd8982fa.png](https://i-blog.csdnimg.cn/blog_migrate/ea19f0974f284609adb195badd63c2a7.jpeg)
Java IO 装饰者模式
【说明】结合装饰模式的图,一目了然,完全的装饰者模式的思想。
现在再看到这行代码,大家应该就理解了背后的模式思想了:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(xxx))
未完待续..............下一篇会讲解java BIO模式下的网络IO基本代码和知识点