gpt4 book ai didi

java - Java I/O 流过滤器示例

转载 作者:行者123 更新时间:2023-12-02 08:38:07 25 4
gpt4 key购买 nike

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

最佳答案

如果您指的是 FilterInputStream/FilterOutputStream 的示例,那么您只需要查看 JDK。为了便于论证,我将讨论输入流变体,但这同样适用于输出流。

例如,看看 InflaterInputStream。查看 arry read() 方法,并注意 if 在某个时刻如何调用 fill(),而 fill() 又从底层输入流中读取。然后,围绕该方法,它调用 Inflater 来实际将从底层流中提取的“原始”字节缓冲区转换为写入调用方数组的实际字节。

需要考虑的一件事是 FilterInputStream 有点浪费空间。只要您可以定义您的InputStream以获取另一个底层InputStream,并且在您从该底层流读取的所有读取方法中(记住理论上您只需要定义byte 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() 来获取底层数据之间进行选择...!

关于java - Java I/O 流过滤器示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/765473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com