在总结 Java Basic IO 时,发现 java.io 包的相关类真心不少~~。看到一堆“排山倒海”般的类,我想,唯有英雄联盟中小炮的台词才能表现此刻我的心情:

跌倒了没?崩溃了没?

学 Java 的,学过装饰者模式一般都知道一个典型的应用:Java 的基本 IO 使用了装饰者模式(更多的 JDK 中使用的设计模式,请点我)。也因此知道了为什么 io 包里为什么会有这么多的类~~,引用《HeadFirst 设计模式》的话:

Java I/O 也引出装饰者模式的一个“缺点”:利用装饰者模式,常常造成设计中有大量的小类,数量实在太多,可能会造成使用此 API 程序员的困扰。

废话不多说了,直接上装饰者模式的类图:

看完装饰者模式的类图后,再以装饰者模式的角度来总结下 I/O类:

由于InputStream、OutputStream、Reader和Writer的结构大同小异,因此上图主要给出了InputStream和Reader的详细子类(一个字节级的,一个字符及的)

有了上面的图片,在使用基本io时就好办多了。首先根据需求来判断是操作字节(InputStream 和 OutputStream),还是操作字符(Reader 和 Writer)来选择不同的分支,然后根据是操作对象还是文件等来选择具体的组件(装饰者模式的 ConcreteComponent),最后根据是否需要缓冲区等功能来使用相应的装饰者类来包装具体组件类。

简单例子:以字节流方式读取图片。因为读取的是图片,因此不能选择字符操作的 Reader,应选择 InputStream;因为图片属于文件系统中的文件,所以选择FileInputStream;又因为我们觉得一次读取一个字节不合适,我们又使用 BufferedInputStream 来包装具体组件 FileInputStream。因此有了以下代码

InputStream ips = new BufferedInputStream( new FileInputStream("..."));

扩展阅读

Java API 文档

Java Basic I/O官方教程

The Decorator pattern and Java.IO package(装饰者模式与Java IO包)(需扶梯)

深入分析 Java I/O 的工作机制

设计模式在Java核心库的使用

最新文章

  1. 当年只会C# 所以写C++就成这样了!
  2. DOM相关属性,方法,兼容性问题处理小析
  3. 【BZOJ】2212: [Poi2011]Tree Rotations
  4. Linux下mongodb的安装及启动
  5. 蓝桥杯 入门训练 Fibonacci数列(水题,斐波那契数列)
  6. DOS下如何同时显示时区日期和时间
  7. 无限极分类sql数据库的设计
  8. 通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)
  9. sqlserver 2008存储过程 多个可空条件任意组合
  10. nginx fastcgi buffers影响页面输出数据大小记录
  11. [转]Top 10 DTrace scripts for Mac OS X
  12. 安卓常用 widget
  13. 【JavaScript中的this详解】
  14. PocScan的搭建与使用
  15. SqlServer xml类型 查询及操作
  16. 关于linux 共享内存查看已经完整释放
  17. MySql常用 join 详解
  18. Windows7安装程序无法定位现有系统分区,也无法创建新的系统分区
  19. MyBatis全局配置文件MyBatis-config.xml代码
  20. MySQL 0Day漏洞出现 该漏洞可以拿到本地Root权限

热门文章

  1. C#Question:“XXX”的重载均与“System.Threading.WaitCallback”不匹配。
  2. leetcode575
  3. Python 迭代器和生成器(转)
  4. spring-boot-actuator健康监控
  5. Ubuntu更新命令 <转>
  6. securecrt免密码登录
  7. 监控windows
  8. Oracle和Mysql的区别 转载
  9. 往数据库添加的时候(只添加以前未添加的记录的写法)c#
  10. php 导出csv表格文件