概论

java的io包下大概有85个类,真复杂。其实不然这些类又可以分为以下四个部分。

输入流                输出流

字节流         InputStream          OutputStream

字符流          Reader               Writer  

简单来说,这四部分的对应都是很整齐的,有FileInputStream就有FileOutputStream,有BufferedReader就有BufferedWriter。

为了简便我们就以InputStream为例说说io库中的设计模式------装饰模式

首先关于装饰模式大家请看

http://blog.csdn.net/dlf123321/article/details/9177335

这是我自己在读<<HeadFirst 设计模式>>时做的学习笔记。或者大家可以直接去看HeadFirst。

现在我们看看io的具体类图



FileInputSteam,ByteArrayInputStream就是上面的各种"咖啡",是可以被包装的,前者从文件中读取数据,后者是从字节数组中读取数据。而FilterInputStream就是装饰类的基类,BufferedInputStream就是一个外壳,可以包裹之前所说的那些个"咖啡",它里面有一个InputStream的引用,

现在我说说FileInputSteam与BufferedInputStream

FileInputSteam,就是给文件这个数据源上装一个管道,读数据的时候,就是一个字节一个字节的读。如果把数据源想象成一个水库,使用FileInputSteam就是一滴水一滴水的从桶里取水。

BufferedInputStream它的作用就是在数据源上装一个"小桶"。以后取水的时候就是直接对这个小桶操作(桶首先会从数据源里装上水)。这样一来效率肯定高了。

具体的实现比较复杂,大家可以看看这个

http://icanfly.iteye.com/blog/1207397

别的几个装饰器也类似。

HeadFirst的例子

关于javaio中装饰模式的使用,我不想过多的将具体实现。现在咱们看一个来自HeadFirst的例子。将文件中的大写字面转换成小写字母。

import java.io.*;

public class LowerCaseInputStream extends FilterInputStream {

    public LowerCaseInputStream(InputStream in) {
        super(in);
    }

    public int read() throws IOException {
        int c = super.read();
        return (c == -1 ? c : Character.toLowerCase((char)c));
    }

    public int read(byte[] b, int offset, int len) throws IOException {
        int result = super.read(b, offset, len);
        for (int i = offset; i < offset+result; i++) {
            b[i] = (byte)Character.toLowerCase((char)b[i]);
        }
        return result;
    }
}

public class InputTest {
    public static void main(String[] args) throws IOException {
        int c;

        try {
            InputStream in =
                new LowerCaseInputStream(
                    new BufferedInputStream(
                        new FileInputStream("test.txt")));

            while((c = in.read()) >= 0) {
                System.out.print((char)c);
            }

            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

那个test.txt文件里的内容是:asdfwwwwwEEEEEE

最后运行InputTest,输出的内容是asdfwwwwweeeeee

参考资料

http://blog.csdn.net/class281/article/details/24849275

http://www.cnblogs.com/mengdd/archive/2013/02/12/2910302.html

http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html

java的io库用到的装饰模式是如何体现的?的更多相关文章

  1. 从Decorator,Adapter模式看Java的IO库

    我想任何一本介绍模式的书在讲到Decorator模式的时候不能不提到它的实际应用--在Java/IO库里面的应用,<<Java与模式>>这本书也不例外,有点不一样的是,这本书在 ...

  2. 面试(Java之IO与NIO)

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  3. java I/O库的设计模式

    在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式.      在任何一种计算机语言中,输入/输出都是一个很重要的部分.与一般的计算机语言相比,java将输入/输出的功能和使 ...

  4. Java学习随笔4:Java的IO操作

    1. IO流的作用是读写设备上的数据,如硬盘文件.内存.键盘.网络等.根据数据走向,可分为:输入流和输出流:根据处理的数据类型,可分为:字节流和字符流.字节流可以处理所有类型的数据,如MP3.图片.视 ...

  5. 意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分

    最近研发BDC 云开发部署平台的数据路由及服务管理器意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提 ...

  6. JAVA的IO学习

    IO 有具体的分类: 有具体的分类:1:根据处理的数类型不同:字节流和字符流.2:根据流向不同:输入流和输出流. =============(补充字节跟字符概念区分)================= ...

  7. Java面向对象 IO (一)

     Java面向对象  IO  (一) 知识概要:                (1)IO概述 (2)IO流的常用基类 (3)IO程序的书写 (4)字符流  写入  读取  文本文件的两种读取方式 ...

  8. (转)Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    原文出自:http://blog.csdn.net/anxpp/article/details/51512200 1.BIO编程 1.1.传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间 ...

  9. Java的IO系统

     Java IO系统     "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务."     由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...

随机推荐

  1. Android优化之ViewPager的懒加载

    转载本博客请注明出处:点击打开链接    http://blog.csdn.net/qq_32059827/article/details/52487794 出于对用户消耗流量的考虑,有必要对view ...

  2. introduction of velocity

    一.velocity 简介 基于java 的模板引擎,apache 旗下的开源软件项目. 目的在于隔离 表示层和业务逻辑层,当然现在做的不仅仅是这些. 二.应用场景 web 应用程序:创建html页面 ...

  3. 【一天一道LeetCode】#257. Binary Tree Paths

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  4. Android开发工具下载地址

    Android Studio: http://zdz.la/iq4zSa

  5. android修改HOLO对话框风格

    andriod中修改对话框的风格,可以通过设置theme来实现,部分元素需要通过Java代码来修改,下面以修改对话框的标题为例说明各步骤. 1.编写一个文本样式. DIALOG的标题是一个textvi ...

  6. 如何判断webview是不是滑到底部

    getScrollY()方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离. getHeight()或者getBottom()方法都返回当前webview这个容器的高度 ge ...

  7. Windows7 x64 跨平台开发环境安装配置

    ======================================================================= Windows7 x64 跨平台开发环境安装配置 201 ...

  8. iOS中 常用的mac终端指令汇总 技术分享

    通常情况下,只有高端用户才会经常用到终端应用.这并不意味着命令行非常难学,有的时候命令行可以轻松.快速的解决问题.相信所有Mac用户都尝试过命令行,今天为大家带来9个非常实用的命令行操作.一些命令行需 ...

  9. 12、Libgdx的图像之全屏和垂直同步

    (官网:www.libgdx.cn) 检测当前设置 判断是否设置全屏,可以通过如下方式: boolean fullscreen = Gdx.graphics.isFullscreen(); 设置全屏和 ...

  10. 《java入门第一季》之Calendar类小案例获取任意二月天数

    import java.util.Calendar; import java.util.Scanner; /* * 获取任意一年的二月有多少天 * * 分析: * A:键盘录入任意的年份 * B:设置 ...