Java I / O流过滤器的示例

时间:2009-04-19 14:13:29

标签: java sockets network-programming filter stream

我正在寻找示例代码,演示如何创建理解二进制数据的过滤器。非常感谢链接到示例。

2 个答案:

答案 0 :(得分: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 - 实际上,它是在想要调用in.read()或super.read()来获取底层数据之间的选择。 ...!

答案 1 :(得分:1)

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

当然,其他应用程序可能会选择使用其他编码。例如,ASN.1 "distinguished encoding rules"用于公钥基础结构应用程序。 Lucene provides good documentation的文件格式,专为紧凑性而设计。

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