Java:意外的 InputStream 行为

标签 java url jar inputstream

我在我的计算机上将一个大小为 21 KB 的 JAR 文件上传到一个网站。我找到了该 JAR 文件的直接链接,并为该文件创建了一个 InputStream:

URL url = new URL("addresstofile");
InputStream stream = url.openStream();

预计流中可用的字节数约为 21,000。但是,可用数量为 7,048。为了调试,我将这 7,048 个字节保存在字节数组中,然后将这些字节写入扩展名为“.jar”的临时文件

我提取 JAR 文件中的类(即 7 KB;原始文件为 21 KB)。大多数类都在那里,除了我注意到嵌套类不存在。我不确定这是为什么 - InputStream 只是从那里切掉只是巧合,还是嵌套类有一些特殊的异常(exception)?

为什么 InputStream 的行为如此奇怪? 谢谢!

@Neil:这行得通!非常感谢!

最佳答案

在您提供的代码的修改版本中,问题在于比较。在与 -1 进行比较之前,不要将 'b' 转换为 int 。如果你这样做,那么如果流中的一个字节恰好是 255,你将无法区分这个字节和流的结尾。

因此,将 read() 返回的 int 与 -1 进行比较。然后,如果它不是 -1,则将该值转换为一个字节并将其放入数组(或其他任何内容)中。

int b;
while ((b = stream.read()) != -1)
{
    data[length++] = (byte) b;
}

关于Java:意外的 InputStream 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9559073/

相关文章:

java - 如何使两个单独的 Mac 终端(命令提示符窗口)相互发送短信而不会出现 "Address already in use"错误?

java - 在 JAVA 公式中使用 If 语句

javascript - 在 URL 中传递一个包含 '%' 的参数?

java - 如何通过 jar 文件更新使用 DCEVM/Hotswap Agent?

java - 编写 jar 文件实用程序

java - 偷偷摸摸的 Java 类型转换

java - FirebaseAuth 未创建用户

Python 使用 Javascript 获取重定向 URL

url - SEO定位: Different URL for different kind of users in the same website

java - 通过快捷方式启动可执行 jar 时出现错误的目录