【问题标题】:Java: unexpected InputStream behaviorJava:意外的 InputStream 行为
【发布时间】:2012-03-04 21:42:09
【问题描述】:

我在我的计算机上将一个大小为 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 只是在那里中断只是巧合,还是嵌套类有一些特殊例外?

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

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

【问题讨论】:

  • 流仅在对read() 的调用返回-1 时结束。忽略available() 方法。确实用处不大。

标签: java url jar inputstream


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    在输入流上调用 available() 会告诉您现在可以读取多少字节 - 因为网络 I/O 不一定是整个文件,很可能只是在本地套接字中缓冲的内容。循环并继续尝试。

    【讨论】:

      【解决方案3】:

      预计流中可用的字节数 约为 21,000

      为什么?

      你怎么可能知道在没有阻塞的情况下可以读取的字节数是 21,000?

      【讨论】:

      • 因为文件在我的电脑上是 21 KB。
      • @MartinTuskevicius 所以?你怎么知道 I/O 系统可以在不阻塞的情况下读取所有内容?我的问题旨在让您思考 available() 方法的 actual 定义,并意识到它没有指定返回流的总长度。事实上,Javadoc 中对此有一个具体的警告。
      猜你喜欢
      • 2011-10-06
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多