加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Java 过滤流

(2010-04-28 15:25:03)
标签:

it

java

过滤流

decorator

缓存流

数据流

打印流

分类: Java

[ 过滤(Filter)流与装饰器 (Decorator) 设计模式 ]

java.io.FilterInputStream 和 java.io.FilterOutputStream 用来为一个输入(或输出)流添加额外的功能。FilterInputStream/FilterOutputStream 本身继承于 InputStream/OutputStream,是一个(is a) 输入/输出流 ,同时它通过拥有 (has a) 另一个输入/输出流,并为这个流添加额外的功能。这种结构是 Decorator 设计模式的典型应用。

 

http://s6/middle/66e177ddg85596ac11415&690过滤流" TITLE="Java 过滤流" />

抽象的 Decorator 设计模式结构图

其中各元素对照如下:

Component              -> InputStream/OutputStream

ConcreteComponent      -> 如:FileInputStream/FileOutputStream

Decorator              -> FilterInputStream/FilterOutputStream

ConcreteDecoratorA     -> BufferedInputStream/BufferedOutputStream

ConcreteDecoratorB     -> DataInputStream/DataOutputStream

ConcreteDecoratorC     -> PrintStream

需要注意的是:过滤流(装饰类)并没有改变实际的读写行为,只是扩展了进一步处理数据的功能,它们的构造必须使用一个已经存在的输入流/输出流,并用它进行实际的读写。

 

java.io.FilterInputStream/FilterOutputStream 重写了所有 InputStream/OutputStream 的方法,但仅仅是调用它所“装饰”的输入流,从本质说没有做额外的任何事。它的作用更多是作为具体过滤流的基类(作用类似于上图的接口 Decrorator),具体的过滤流应该重写其中的方法,提供更具体的实现。如下面的常用的过滤流。

 

[ java.io 包中的常用过滤流 ] 

缓存流 BufferedInputStream/BufferedOutputStream

缓冲流为输入/输出流提供了缓存的功能,它们并没有增加新的方法。由于维护缓存,使得 BufferedInputStream 具有 mark 和 reset 功能; BufferedOutputStream 中的 flush 方法真正起作用 —— 把缓存中的数据真正写出到所修饰的输出流。

数据流 DataInputStream/DataOutputStream

数据流主要提供了功能上的扩展:以Java 基本数据类型(8大类型,但见本站其它文章)和 UTF (稍不同于标准的UTF) 的形式读写数据;以字符数组/字节数组的形式写字符串等。

通常情况下,DataInputStream 和 DataOutputStream 配套使用,使用者应确保读取得顺序与写入的顺序相同,以保证读到预期的信息。

 

数据流读写对照表:

 

DataOutputStream DataInputStream
void writeByte(int v) byte readByte() 或 int readUnsignedByte()
void writeShort(int v) short readShort() 或 int readUnsignedShort()
void writeInt(int v) int readInt()
void writeLong(long v) long readLong()
void writeFloat(float v) float readFloat()
void writeDouble(double v) double readDouble()
void writeBoolean(boolean v) boolean readBoolean()
void writeChar(char v) char readChar()
void writeBytes(String s)
void writeChars(String s)
void writeUTF(String s) String readUTF()

 

 

下面的示例演示缓存流数据流的使用。

 

// TestFilter.java

 

import java.io.*;

public class TestFilter
{
 public static void testBufferedStream()
 {
  try{
   FileInputStream fis = new FileInputStream("TestFilter.java");
   BufferedInputStream bis = new BufferedInputStream(fis);   // 使用文件输入流 fis 创建一个新的过滤流-缓存流
   
   if (bis.markSupported())
   {
    System.out.println("Yes");
    bis.mark(10);
    byte[] buf = new byte[6];
    int read = bis.read(buf);
    System.out.println(new String(buf) + " read");
    bis.reset();
    read = bis.read(buf);
    System.out.println(new String(buf) + " read again");
    
   }
   bis.close();
   
  }catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 
 public static void testDataStream()
 {
  try{
   FileOutputStream fos = new FileOutputStream("newfile");
   DataOutputStream dos = new DataOutputStream(fos);   // 使用文件输出流 fos 创建一个新的过滤流-数据流
   
   dos.writeByte(1);
   dos.writeShort(2);
   dos.writeInt(3);
   dos.writeLong(4);
   dos.writeFloat(5.0f);
   dos.writeDouble(6.0);
   dos.writeBoolean(true);
   dos.writeChar('H');
   dos.writeUTF("伊晓强");
   dos.writeBytes("伊晓强");
   dos.writeChars("伊晓强");
      
   dos.close();
   
   FileInputStream fis = new FileInputStream("newfile");
   DataInputStream dis = new DataInputStream(fis);   // 使用文件输入流 fis 创建一个新的过滤流-数据流
   
   System.out.println(dis.readByte());
   System.out.println(dis.readShort());
   System.out.println(dis.readInt());
   System.out.println(dis.readLong());
   System.out.println(dis.readFloat());
   System.out.println(dis.readDouble());
   System.out.println(dis.readBoolean());
   System.out.println(dis.readChar());
   System.out.println(dis.readUTF());
   
   dis.close();
   
  }catch(Exception e)
  {
   e.printStackTrace();
  }
 }

 public static void main(String[]args)
 {
  testBufferedStream();
  testDataStream();
 }
}

 

注:关于字符编码与解码,请参考本站其它文章。   

 

打印流 PrintStream

打印流是另一种常见的过滤流,提供了打印各种数据类型更为方便的方法。我们常用的 System.out 就是这种类型,它的特点包括:

  • 从不抛I/O异常 (但异常情况可以通过 checkError 获取)
  • 自动调用 flush ,当 println 或 print 打印 '\n' 时
  • 支持换行的打印 println 和不换行的打印 print 两套方法
  • 提供格式化的打印方法 printf (从 JDK1.5 开始)

 

[其他过滤流] 

为输入/输出流添加额外的功能,满足特定的需要,过滤流的应用非常广泛,除了上面提到的三种常用的过滤流,JDK 1.5 还提供了如下过滤流应用于压缩,解密,安全等不同的领域:

java.util.zip.CheckedInputStream/java.util.zip.CheckedOutputStream

java.util.zip.DeflaterInputStream/java.util.zip.DeflaterOutputStream
javax.crypto.CipherInputStream/javax.crypto.CipherOutputStream

java.security.DigestInputStream/java.security.DigestOutputStream

 

java.io.PushbackInputStream
javax.swing.ProgressMonitorInputStream

相关示例请参考本站其它文章

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有