【IO 设计模式】

本贴最后更新于 2522 天前,其中的信息可能已经物是人非

一、引言

Java IO 设计本身比较经典,隐藏着两种设计模式。看设计模式的书籍总觉得用不起来,在项目中真正开始熟悉 IO 的常用对象,如 InputStream,BufferedInputStream,DataInputStream,你就会发现装饰设计模式的妙用。
Java IO

二、输入、输出流的使用

需求:带缓存的读取文件的数据,文件中的数据类型包括 byte、char、int、long、String 等基本数据类型。

try {
InputStream in = new FileInputStream(fileName);
 DataInputStreamdata inBuffer = new DataInputStream(new BufferedInputStream(in,             Constant.TOPIC_WRITE_BUFFER_SIZE));
} catch (FileNotFoundException e) {
e.printStackTrace();
}


这里用到了 InputStream、BufferInputStream、DataInputStream 的一个组合。因为 InputStream 是面向字节流的,本身无法直接读取 int、String 这类多字节数据,必须将连续读入的 4 byte 转换成 int 数据类型,DataInpuStream 就能满足这个需求,在它里面实现从 byte 到基本数据类型的转换功能。另一方面为了提高效率,还使用了 BufferInputStream 来缓存读入的数据,而不是每 byte 都从文件读。

三、装饰设计模式

InputStream、BufferInputStream、DataInputStream 组合,不断在基本的 InputStream 上加入新的功能,如读取基本数据类型、缓冲功能,这个过程其实是在装饰 InputStream。看下面的这张图就是 IO 设计中隐藏的装饰设计模式。真正的 IO 字节读取时由 FileInputStream 实现,FilterInputStream 是继承了 Inpustream 的抽象装饰类,具体的装饰类,如 BufferedInputStream,DataInputStream,PushbackInputStream。装饰类可以组合起来装饰具体的 InputStream 类如 FileInputStream,ByteArrayInputStream。

四、适配器设计模式

如果你想把字节数据当字符来读取,需要 InputStreamReader 帮你适配。
BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf8"));
//将字节流接口,转换成字符流接口
br.readLine();

五、后记

通过对 Java I/O 框架中的主要类及其设计的分析,将设计模式与实际应用设计对照,最后能够在实际使用中达到灵活运用装饰和适配设计模式,解决设计需求。

  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • IO
    8 引用 • 20 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...