我正在寻找示例代码,演示如何创建理解二进制数据的过滤器。非常感谢链接到示例。
答案 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类的源代码。