0.装饰器模式

Java I/O类库需要多种不同功能的组合,这正是使用装饰器模式的理由所在。这也是Java I/O类库里存在filter(过滤器)类的原因所在,抽象类filter是所有装饰器类的基类。装饰器必须具有和它所装饰的对象相同的接口,但它也可以扩展接口,而这种情况只发生在个别  filter类中。

但是,装饰器模式也有一个缺点:在编写程序时,它给我们提供了相当多的灵活性(因为我们可以很容易地混合和匹配属性),但是它同时也增加了代码的复杂性。Java I/O类库操作不便的原因在于:我们必须创建许多类一一“核心”I/O类型加上所有的装饰器,才能得到我们所希望的单个I/O对象。

1.FilterlnputStreamFilterOutputStream

FilterlnputStreamFilterOutputStream用来提供装饰器类接口以控制特定输入流( InputStream)和输出流(OutputStream)的两个类,它们的名字并不是很直观。FilterInput­Stream和FilteOutputStream分别自I/O类库中的基类InputStreain和OutputStream派生而来,这两个类是装饰器的必要条件(以便能为所有正在被修饰的对象提供通用接口)。

(1)JDK API 中 FilterlnputStream类

(2)JDK API 中 FilterOutputStream

2.BufferedInputStream & BufferedOutputStream

BufferedInputStream是带缓冲区的输入流,默认缓冲区大小是8M,能够减少访问磁盘的次数,提高文件读取性能;

BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入效率。

BufferedInputStream与BufferedOutputStream分别是FilterInputStream类和FilterOutputStream类的子类,实现了装饰设计模式。下面是例子演示使用BufferedInputStream和BufferedOutputStream实现照片复制

 public class CopyPicByBuffer {

 	public static void main(String[] args) throws IOException {
 		/**
 		 * 使用BufferedInputStream和BufferedOutputStream实现照片复制
 		 */
 		copyPicByBuffer();
 	}

 	private static void copyPicByBuffer() throws IOException {
 		// TODO Auto-generated method stub
 		//演示缓冲区
 		//1.创建输入流对象
 		FileInputStream fis = new FileInputStream("H:\\workspace\\Testfile\\1.jpg");
 		BufferedInputStream bufis = new BufferedInputStream(fis);//装饰设计模式

 		//2.创建输出流对象
 		FileOutputStream fos = new FileOutputStream("H:\\workspace\\Testfile\\1-copybybuffer.jpg");
 		BufferedOutputStream bufos = new BufferedOutputStream(fos);//装饰设计模式

 		int by = 0;
 		while((by = bufis.read()) != -1){
 			bufos.write(by);
 			bufos.flush();//刷新
 		}
 		fos.close();
 		fis.close();
 		System.out.println("复制结束!");
 	}
 }
 

2017-12-31 内容来自Java编程思想和传智播客课程

BufferedInputStream与BufferedOutputStream用法简介

Java I/O---添加属性和有用的接口—FilterlnputStream&FilterOutputStream的更多相关文章

  1. JAVA“动态”为类添加属性

    部分参考:http://www.cnblogs.com/zy2009/p/6725843.html pom.xml中添加: <dependency> <groupId>comm ...

  2. java操作xm——添加、修改、删除、遍历

    package com.xml.zh; import javax.xml.parsers.*; import javax.xml.transform.Transformer; import javax ...

  3. PropertyGrid—添加属性Tab

    零.引言 PropertyGrid用来显示和编辑对象的属性,前面已经简单介绍了如何使用该控件和提供不同的属性编辑方法.前面主要讲如何使用该控件,但有时,该控件无法满足我们的需求,就需要对其进行扩展.本 ...

  4. C#访问Java的WebService添加SOAPHeader验证的问题

    原文:C#访问Java的WebService添加SOAPHeader验证的问题 这两天做与公司OA的接口,发现C#访问Java的WebService需要提供一个SOAP的头验证信息,但是WebServ ...

  5. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言与静态语言 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C ...

  6. 给HTML页面指定元素添加属性,添加父元素

    给HTML页面指定元素添加属性,添加父元素 下面拿一个给富文本中所有的图片增加layer弹窗效果. 思路: 给富文本父元素设置属性. 获取父元素里所有的img   此处用到querySelectorA ...

  7. (3)java数据结构--有枚举 属性

    java中的数据结构 - 南风顾 - 博客园http://www.cnblogs.com/tingxuelou/p/6686143.html 线性表,链表,哈希表是常用的数据结构,在进行Java开发时 ...

  8. js/java 获取、添加、修改、删除cookie(最全)

      一.cookie介绍 1.cookie的本来面目 HTTP协议本身是无状态的.什么是无状态呢,即服务器无法判断用户身份.Cookie实际上是一小段的文本信息(key-value格式).客户端向服务 ...

  9. runtime-给系统已有类添加属性

    在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种.类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添 ...

随机推荐

  1. BOM物料清单在输入用料计划时快捷选择物料没有带出单位

    问题: 在新增BOM物料清单时,输入用料计划,快捷选择物料没有带出单位,但是从清单查找里面选择物料,是可以自动带出单位的. 原因分析查找: 1.这是个自定义单据,到tools工具上查看相关设置,看清单 ...

  2. python从2.7升级到3.5 需要主要的问题

    今天鼓足勇气把我们python从2.7升级到3.5.我用的是pycharm开发工具.升级过程遇到一些问题小结下: 1.右击项目: 找到左侧 project interpreter选项,配置项目开发环境 ...

  3. MyBatis物理分页的代码实现

    一.分页 MyBatis有两种分页方法:内存分页,也就是假分页,本质是查出所有的数据然后根据游标的方式,截取需要的记录,如果数据量大,执行效率低,可能造成内存溢出.物理分页,就是数据库本身提供了分页方 ...

  4. js-引用类型-Array

    1.数组的操作方法 <html> <meta http-equiv="content-type" charset="utf-8" /> ...

  5. css中的float和position

    1.float <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. Mybatis分页插件PageHelper使用

    一. Mybatis分页插件PageHelper使用  1.不使用插件如何分页: 使用mybatis实现: 1)接口: List<Student> selectStudent(Map< ...

  7. 问题记录-运行Tomcat,项目程序没有响应

    问题描述:运行Tomcat,项目程序没有响应原因在于 修改成一致路径即可解决.

  8. 04.redis集群+SSM整合使用

    redis集群+SSM整合使用 首先是创建redis-cluster文件夹: 因为redis最少需要6个节点(三主三从),为了更好的理解,我这里创建了两台虚拟机(192.168.0.109 192.1 ...

  9. codeforces 895B XK Segments 二分 思维

    codeforces 895B XK Segments 题目大意: 寻找符合要求的\((i,j)\)对,有:\[a_i \le a_j \] 同时存在\(k\),且\(k\)能够被\(x\)整除,\( ...

  10. gem install报错

    [root@app-test ruby-2.2.3]# gem install capistrano -v 2.15 ERROR:  While executing gem ... (Gem::Rem ...