gpt4 book ai didi

Java InputStream读取问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:37:45 25 4
gpt4 key购买 nike

我有一个 Java 类,我在其中通过 InputStream 读取数据

    byte[] b = null;
try {
b = new byte[in.available()];
in.read(b);
} catch (IOException e) {
e.printStackTrace();
}

当我从 IDE (Eclipse) 运行我的应用程序时,它工作得很好。

但是当我导出项目并将其打包在 JAR 中时,读取命令不会读取所有数据。我该如何解决?

此问题主要发生在 InputStream 是文件(~10kb)时。

谢谢!

最佳答案

通常我更喜欢在从输入流读取时使用固定大小的缓冲区。正如 evilone 指出的那样,使用 available() 作为缓冲区大小可能不是一个好主意,因为如果您正在读取远程资源,那么您可能无法提前知道可用字节。您可以阅读 InputStream 的 javadoc以获得更多的洞察力。

这是我通常用来读取输入流的代码片段:

byte[] buffer = new byte[BUFFER_SIZE];

int bytesRead = 0;
while ((bytesRead = in.read(buffer)) >= 0){
for (int i = 0; i < bytesRead; i++){
//Do whatever you need with the bytes here
}
}

我在这里使用的 read() 版本将尽可能多地填充给定的缓冲区,并且返回实际读取的字节数。这意味着您的缓冲区有可能包含尾随垃圾数据,因此仅使用不超过 bytesRead 的字节非常重要。

请注意 (bytesRead = in.read(buffer)) >= 0 行, InputStream 规范中没有任何内容表明 read() 无法读取 0 字节。 根据您的情况,您可能需要将 read() 读取 0 字节的情况作为特殊情况处理。对于本地文件,我从未遇到过这种情况;但是,在读取远程资源时,我实际上看到 read() 不断读取 0 字节,导致上述代码陷入无限循环。我通过计算读取 0 字节的次数解决了无限循环问题,当计数器超过阈值时我将抛出异常。你可能不会遇到这个问题,但请记住这一点:)

出于性能原因,我可能会避免为每次读取创建新的字节数组。

关于Java InputStream读取问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6160432/

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