2009-04-19 117 views

回答

1

如果您的意思是FilterInputStream/FilterOutputStream的示例,那么您只需看看JDK就可以了。为了讨论我将讨论输入流变体,但输出流也是如此。例如,请查看InflaterInputStream。查看arry read()方法,并注意如何调用fill(),然后从底层输入流读取数据。然后,围绕该方法,它调用Inflater将实际将其从底层流中抽取的“原始”字节缓冲区转换为写入调用者数组的实际字节。

有一点需要考虑的是FilterInputStream有点浪费空间。只要你可以定义你的InputStream接受另一个底层的InputStream,并且在你从底层流中读取的所有读取方法中(记住理论上你只需要定义字节read()方法),那么特别是让你的类扩展FilterInputStream并不会真的给你带来太多的收益。例如,下面是输入流代码的一部分,它限制了底层流允许调用者读取的字节数(实际上,我们可以将一个流“切分”成多个子流,这很有用从档案文件读取时,例如):

class LimitedInputStream extends InputStream { 
    private InputStream in; 
    private long bytesLeft; 

    LimitedInputStream(InputStream in, long maxBytes) { 
    this.in = in; 
    this.bytesLeft = maxBytes; 
    } 

    @Override 
    public int read() throws IOException { 
    if (bytesLeft <= 0) 
     return -1; 
    int b = in.read(); 
    bytesLeft--; 
    return b; 
    } 

    @Override 
    public int read(byte b[], int off, int len) throws IOException { 
    if (bytesLeft <= 0) 
     return -1; 
    len = (int) Math.min((long) len, bytesLeft); 
    int n = in.read(b, off, len); 
    if (n > 0) 
     bytesLeft -= n; 
    return n; 
    } 

    // ... missed off boring implementations of skip(), available().. 
} 

在这种情况下,我的应用程序,它确实给我买了没什么效果声明这个类作为FilterInputStream--,它是想在调用之间进行选择。 read()或super.read()来获取底层数据......!

1

举一个很好的例子,我建议看看java.io.DataInputStream的源代码。该类向您展示了一种从“二进制”数据中解码原始类型和字符串的方法,从中可以生成更复杂的结构。

当然,其他应用程序可能会选择使用其他编码。例如,​​用于公钥基础结构应用程序。其文件格式为Lucene provides good documentation,专为简洁而设计。

如果您有Sun JDK,请在其顶部目录中查找“src.zip”。如果你告诉他们在哪里可以找到这个文件,大多数IDE将向你展示核心Java类的源代码。