0.装饰器模式
Java I/O类库需要多种不同功能的组合,这正是使用装饰器模式的理由所在。这也是Java I/O类库里存在filter(过滤器)类的原因所在,抽象类filter是所有装饰器类的基类。装饰器必须具有和它所装饰的对象相同的接口,但它也可以扩展接口,而这种情况只发生在个别 filter类中。
但是,装饰器模式也有一个缺点:在编写程序时,它给我们提供了相当多的灵活性(因为我们可以很容易地混合和匹配属性),但是它同时也增加了代码的复杂性。Java I/O类库操作不便的原因在于:我们必须创建许多类一一“核心”I/O类型加上所有的装饰器,才能得到我们所希望的单个I/O对象。
1.FilterlnputStream和FilterOutputStream
FilterlnputStream和FilterOutputStream用来提供装饰器类接口以控制特定输入流( 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实现照片复制:
1 public class CopyPicByBuffer { 2 3 public static void main(String[] args) throws IOException { 4 /** 5 * 使用BufferedInputStream和BufferedOutputStream实现照片复制 6 */ 7 copyPicByBuffer(); 8 } 9 10 private static void copyPicByBuffer() throws IOException { 11 // TODO Auto-generated method stub 12 //演示缓冲区 13 //1.创建输入流对象 14 FileInputStream fis = new FileInputStream("H:\\\\workspace\\\\Testfile\\\\1.jpg"); 15 BufferedInputStream bufis = new BufferedInputStream(fis);//装饰设计模式 16 17 //2.创建输出流对象 18 FileOutputStream fos = new FileOutputStream("H:\\\\workspace\\\\Testfile\\\\1-copybybuffer.jpg"); 19 BufferedOutputStream bufos = new BufferedOutputStream(fos);//装饰设计模式 20 21 int by = 0; 22 while((by = bufis.read()) != -1){ 23 bufos.write(by); 24 bufos.flush();//刷新 25 } 26 fos.close(); 27 fis.close(); 28 System.out.println("复制结束!"); 29 } 30 } 31
2017-12-31 内容来自Java编程思想和传智播客课程
BufferedInputStream与BufferedOutputStream用法简介