1、I/O分类与装饰者模式

基本java I/O包含两种类型的流,字节流(inputStream、outputStream)与字符流(Writer,Reader),关于I/O操作类的设计,用到了装饰者模式,如下图所示。

其中FilterInputStream抽象类继承了InputStream抽象类,并且组合了InputStream类。

public class UpperCaseInputStream extends FilterInputStream { //继承InputStream

//组合InputStream
protected UpperCaseInputStream(InputStream in) {
super(in);
}
  //重写方法 
@Override
public int read() throws IOException {
int c=super.read(); //此处直接调用super方法就会执行被装饰者的read()方法,因为装饰者抽象类的read()方法中有语句this.InputStream.read()。 return (c==-1?c:Character.toUpperCase(c));
}
public static void main(String[] args) throws IOException {
int c;
//使用时,仅需要将被装饰者作为参数,构建装饰者对象即可
InputStream in=new UpperCaseInputStream(new FileInputStream("D:\\JAVAworkspace\\ProgramTest\\src\\StreamDemo.java"));
try {
while((c=in.read())>=0)
{
System.out.print((char)c);
}
}
finally{
in.close();
}
} }

装饰者模式的使用场景:

(1)扩展或者附加另一个类的功能,可以随时撤销这个功能(即不进行装饰),灵活性高。

(2)几种功能的随机组合叠加使用次数频繁时。(叠加使用装饰者类即可)

2、字节流与字符流的区别

  • InputStream,outputstream是所有字节流的基类,reader和writer是所有字符流的基类。在硬盘或者网络传输中最小的存储单元都是字节,但是在程序操作中常用字符。二者可以通过编解码的方式进行转换,当编解码方式不一致的情况下,就会出现乱码问题。
  • 字符流操作时使用了缓冲区,字节流没有。在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果没有关闭,则缓冲区中的内容是无法输出的。但是可以使用flush()函数对其进行强制输出。或者在java7之后有自动关闭资源的新特性,将创建流对象的代码放到try小括号里面,会自动调用流对象的close方法将流关掉。

最新文章

  1. js获取当前域名、Url、相对路径和参数以及指定参数
  2. Record:Handle onClick for our custom LinearLayout for Gallery-like HorizontalScrollView
  3. c++ 中string用c输入输出
  4. VS2010+MVC4+Spring.NET2+NHibernate4-传统三层架构-前篇
  5. ES6新特性:利用解构赋值 (destructuring assignment), 简化代码
  6. Tomcat 6 —— Realm域管理
  7. Android应用目录结构分析
  8. JVM的GC理论详解
  9. uboot启动流程
  10. Posix线程编程指南(4) 线程终止
  11. 检查 CPU 是否支持二级地址转换 - 摘自网络
  12. engine的工具中实现Snapping(捕捉)
  13. Python学习 - 编写一个简单的web框架(二)
  14. 美国TJX公司 - MBA智库百科
  15. .Net多线程编程—误用点分析
  16. Android官方架构组件介绍之LifeCycle
  17. win 域
  18. dll加密工具
  19. vue2.0配置路由
  20. 连接mysql(建表和删表)

热门文章

  1. [后端及服务器][WSL2(Ubuntu)+Docker]从零开始在WSL中安装Docker
  2. Python 全局变量和局部变量,global 和 nonlocal关键字
  3. 菜鸡的Java笔记 第十七 static 关键字
  4. [cf1495E]Qingshan and Daniel
  5. [bzoj1177]Oil
  6. [bzoj5294]二进制
  7. docker 配置redis并远程访问
  8. 了解Threejs中的Clock对象以及简单应用
  9. 手写Bitset优化
  10. Genscan指南