在总结 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核心库的使用

简单总结:以设计模式的角度总结Java基本IO流的更多相关文章

  1. 【Java】IO流简单分辨

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用 ...

  2. java的IO流

    java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...

  3. Java基础——IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  4. JAVA中IO流总结

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...

  5. 第15章-输入/输出 --- 理解Java的IO流

    (一)理解Java的IO流 JAVA的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出(键盘.文件.网络连接等)抽象表述为"流"( ...

  6. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

  7. Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

    Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...

  8. Java基础-IO流对象之字符类(FileWrite与FileReader)

    Java基础-IO流对象之字符类(FileWrite与FileReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见编码简介 1>ASCII 我们知道计算机是 ...

  9. java的IO流,字节流和字符流

    java操作文件都是通过流来处理的,(其实其他很多语言也是这样) 第一:java的IO流,分为:输入流 和 输出流(这真是废话,这是从流向的角度来说的) 第二:java的所有IO流,只分为:字节流 和 ...

随机推荐

  1. leetcode334

    public class Solution { public bool IncreasingTriplet(int[] nums) { var len = nums.Length; ) { retur ...

  2. 获取lable选中时触发事件

    通常做网页时不会用radio和checkbox的原有样式, 会进行样式美化. 如何在点击checkbox时触发一个事件呢? <div class="main-checkbox" ...

  3. delphi XE8 Android SDK SET

    delphi XE Berlin Android SDK SET RAD>Tools>Options>SDk Manager> https://dl-ssl.google.co ...

  4. Spring+Logback的集成总结

    现在好像用logback替换了log4j,具体看了一下介绍,感觉比log4j好很多. logback与log4j的区别如下 http://logback.qos.ch/reasonsToSwitch. ...

  5. 使用Tor创建.onion域名网站(创建暗网服务和暗网的网站)

    使用Tor 的.onion域名创建匿名服务器 Tor不仅可以提供客户端的匿名访问,Tor还可以提供服务器的匿名.通过使用Tor网络,用户可以维护位置不可知的服务器.当然如果要访问这个隐蔽的服务,客户端 ...

  6. linux查看电脑硬件配置

    1. 查看CPU cat /proc/cpuinfo 2. 查看内存 free -m 3. 查看硬盘分区 fdisk -l 4. 查看网卡信息或者ip地址 ifconfig 5. 查看详细的网卡工作模 ...

  7. 新手C#ListView使用记录2018.08.03

    在使用C#的ListView时,感觉有一些部分需要自己注意. ListView1.Clear()这条指令在使用时,用于Click后在ListView中显示数据,应该放在输入数据的前面. 在ListVi ...

  8. 275. H-Index II 递增排序后的论文引用量

    [抄题]: Given an array of citations in ascending order (each citation is a non-negative integer) of a ...

  9. SQL 数据库 学习 005 学习必备的一些操作 --- 如何新建数据库 如何附加和分离数据库(如何备份还原数据库) 如何删除数据库

    我的电脑系统: Windows 10 64位 使用的SQL Server软件: SQL Server 2014 Express 如果我们要学习这个数据库,我们需要学习什么知识.比如:如何新建一个数据库 ...

  10. sqlserver服务器硬件性能瓶颈分析

    硬件性能瓶颈 内存 内存对SQL Server性能的影响胜过任何其他硬件.因此,对SQL Server系统的内存使用情况进行定期监视以确保内存的可用百分比高于20%是很有必要的.如果用户遭遇性能问题, ...