Java:意外的InputStream行为

时间:2012-03-04 21:42:10

标签: 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只是在那里切断,或者嵌套类有一些特殊的例外吗?

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

@Neil:这有效!非常感谢!

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  

预计流中可用的字节数   将是~21,000

为什么?

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