浅谈装饰模式应用于IO中


测试题是这样描述的:编写程序拷贝一个文件, 尽量使用效率高的方式.

我当时使用IO来做这道题的,下面先介绍一下什么是装饰模式:

装饰模式(Decorator pattern)又名包装模式(Wrapper Pattern)

 主要功能也是增加被包装类的功能,虽然继承也是可以实现这一点,但两者还是有区别的,因为为了增加子类的功能可能会创建非常多的类,非常多的继承层次,缺乏灵活性,相互性,而装饰模可以任意组合,非常灵活!

下面我结合IO中的一些接口来对应装饰模式的各种角色:

装饰模式角色对比:

抽象构件角色(Component)相当于IntputStream;

具体构件角色(Concretor )相当于 字节流 FileInputStream

装饰角色     (Decorator)相当于  FilterIntputStream 包装(只是为具体装饰角色提供实现条件)

具体装饰角色  (Concretor Decorator)相当于BufferedInputStream DateInputStream

如果要求效率高,如果只单纯的输出字节,程序每次只能将一个字节读入到文件中去,
如果有一百个字节,就要读一百次。如果加上缓存包装,就可以先将字节存储在内存中, 待需要时一次性传入到文件或硬盘中,极大的提高了效率!!
所以我选择使用过滤流,装饰模式: BufferedInputStream/BufferedOutputStream;

其实就是把类进行包装赋予它们新的功能:下面是我对这道题目的实现:

package com.itheima;


/**
 * 7、 编写程序拷贝一个文件, 尽量使用效率高的方式.
 */
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class Test7
{
/*
* 如果要求效率高,如果只单纯的输出字节,程序每次只能将一个字节读入到文件中去,
* 如果有一百个字节,就要读一百次。如果加上缓存包装,就可以先将字节存储在内存中, 待需要时一次性传入到文件或硬盘中,极大的提高了效率!!
* 所以我选择使用过滤流,装饰模式: BufferedInputStream/BufferedOutputStream;
*/
public static void main(String[] args) throws IOException
{
// 创建输入流;
FileInputStream file = new FileInputStream("c:/源文件名.txt");
// 装饰file;
BufferedInputStream file2 = new BufferedInputStream(file);
byte[] b = new byte[100];//字符转换为字节才能被读取
int length;
String a = null;
while (-1 != (length = file2.read(b, 0, 100)))
{
a = new String(b, 0, length);
System.out.println(a);// 在控制台输出一下
}


// 创建输出流并修饰
FileOutputStream fileCopy = new FileOutputStream("c:/拷贝文件名.txt");
BufferedOutputStream fileCopy2 = new BufferedOutputStream(fileCopy);


byte[] copy = a.getBytes();
fileCopy2.write(copy);
file2.close();
fileCopy2.close();


}
}


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值