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

我当时使用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();

}
}

浅谈装饰模式应用于IO中相关推荐

  1. 浅谈在游戏陪玩开发中常见的几种加密算法及实现

    前言 数字签名.信息加密是游戏陪玩开发前后端都经常需要使用到的技术,应用场景包括了用户登入.交易.信息通讯.oauth 等等,不同的应用场景需要游戏陪玩开发时使用到不同的签名加密算法,或者需要搭配不一 ...

  2. 浅谈反编译在项目中的使用

    浅谈反编译在项目中的使用 什么是反编译 反编译的作用 反编译工具 动态编程 JavaSsist 源码安全 什么是反编译 将可读性较好的高级计算机语言(JAVA,C#,C)转换成计算机能解读.运行的低阶 ...

  3. python竞赛_浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  4. 计算机技术在排水领域的应用,浅谈计算机技术在市政给排水中的应用.doc

    浅谈计算机技术在市政给排水中的应用.doc 浅谈计算机技术在市政给排水中的应用 [摘要]随着科技的进步与时代的发展,计算机技术在各个领域与行业中得到了广泛应.应用计算机技术可以增加工作的科学性与准确性 ...

  5. ajax参数中有加号,浅谈在js传递参数中含加号(+)的处理方式

    一般情况下,URL 中的参数应使用 url 编码规则,即把参数字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+). 但是对于带有中文的参数 ...

  6. PHP字符串转数字面试,浅谈php字符串反转 面试中经常遇到的问题

    下面小编就为大家分享一篇浅谈php字符串反转 面试中经常遇到的问题,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1.单字节字符串反转 php提供了用于字符串反转的函数strrev( ...

  7. android 存储空间监控,浅谈 Android 内存监控(中)

    前言 在上篇 浅谈 Android 内存监控(上) 中,我们聊了 LeakCanary,微信的 Matirx 和美团的 Probe,它们各自有不同的应用场景,例如,在开发测试环境,我们会偏向用 Lea ...

  8. 美育在计算机教育中应用,浅谈在小学信息技术课堂中有效实施美育.

    <浅谈在小学信息技术课堂中有效实施美育.>由会员分享,可在线阅读,更多相关<浅谈在小学信息技术课堂中有效实施美育.(9页珍藏版)>请在人人文库网上搜索. 1.北京市第七届京美杯 ...

  9. 幼儿园案例经验迁移_浅谈在幼儿园数学教学中如何为迁移而教

    浅谈在幼儿园数学教学中如何为迁移而教 前言 培养能力.发展智力是我们教学的重要目标,而学习的迁移则可以说是检验教学是否达到这个目标的最可靠的指标.为迁移而教是当今教育界流行的一个很有吸引力的口号.但遗 ...

最新文章

  1. EasyX和Windows库函数实现音乐播放
  2. 关于C#中实现两个应用程序消息通讯的问题
  3. git命令下载项目,上传android项目到github步骤,以及取消项目关联Git,设置git忽略文件
  4. 自学C语言能到达怎样的高度?
  5. js几种数组排序及sort的实现
  6. React:开发者友好性和易用性
  7. DevExpress XtraGrid网格控件示例四:初始化新建行的单元格
  8. ENVI入门系列教程---一、数据预处理---4.3自定义RPC文件图像正射校正
  9. 转载 Ubuntu系统安装Java JDK和HDFView
  10. 为mandriva 2010 spring打包(geany-0.19.2)
  11. Spark中的Driver
  12. 汉语教学备课工具推荐
  13. C语言m++与++m
  14. docker介绍说明,docker配置代理加速器、docker使用国内镜像仓库
  15. 关于NAS搭建的那些事
  16. 【python角谷猜想】
  17. mysql kill 1095_mysql root用户kill connection报ERROR 1095 (HY000): You are not owner of thread N
  18. Android 摄像头调用(不含拍照),kotlin开源
  19. 【转】如何从第三页开始设置页码
  20. SpringAOP - @within和@annotation区别

热门文章

  1. 参加浙江中医药大学第十一届程序设计竞赛(ACM赛制)的总结
  2. 3_10 MediaMode 中介者模式
  3. docker学习笔记(五)docker实战
  4. 科普 | CPU 是如何工作的?
  5. 这里有一份面筋请查收(二)
  6. 【全真互联网下音视频通信技术演进】
  7. 低代码是什么?有什么优势
  8. 正式启动|2020腾讯犀牛鸟云开发校园技术布道师养成计划
  9. 从独角兽到上市:我们与TAPD的故事
  10. 2018 中国服务创新大会 | 早鸟票正式开售