gpt4 book ai didi

Java 输入流读取缓冲区

转载 作者:行者123 更新时间:2023-11-30 06:47:06 26 4
gpt4 key购买 nike

假设我正在尝试从 Java 输入流中读取数据,如下所示:

ZipInputStream zis = new ZipInputStream(new FileInputStream("C:\\temp\\sample3.zip"));
zis.getNextEntry();
byte[] buffer2 = new byte[2];
int count = zis.read(buffer2));
if(count != -1) //process...
else...//something wrong, abort

我正在解析一个二进制文件,在本例中我将缓冲区设置为 2,因为我想阅读下一个短文。如果我想读取下一个 int 等其他类型,我会将缓冲区大小设置为 4。问题是,有时 zis.read(buffer) 不会填充缓冲区,即使我知道有足够的未读数据来填充缓冲区。我可以简单地将整个文件内容转储到一个数组中并解析它,但最终我最终实现了自己的流读取器来做到这一点,这看起来像是重新发明轮子。我还可以实现一个 read() 函数来检查读取计数,如果小于缓冲区大小,则请求更多数据来填充缓冲区,但这是低效且丑陋的。有更好的方法吗?

这是此处发布的问题的后续问题:

Java ZipInputStream extraction errors

最佳答案

Is there a better way to do this?

嗯... ZipInputStream 最终继承自 InputStream,因此您应该能够用 BufferedInputStream 包装它,然后用 >DataInputStream 并使用 readShortreadInt 等读取数据。

类似这样的事情:

while (zis.getNextEntry() != null) {
DataInputStream dis = new DataInputStream(new BufferedInputStream(zis));
boolean done = false;
do {
short s = dis.readShort();
int i = dis.readInt();
...
} while (!done);
}

注意:您不应关闭 dis 流,因为这会导致 zis 关闭。 (显然,zis 需要在外部级别关闭以避免资源泄漏。)

堆栈中的 BufferedInputStream 确保您不会在底层流上进行大量小型读取……这会很糟糕。

唯一可能的问题是它的方法对于如何表示二进制数据有特定的想法;例如数字是大尾数。如果这是一个问题,请考虑将整个 zip 条目读取到字节数组中,并将其包装在 ByteBuffer 中。

关于Java 输入流读取缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43521536/

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