我在计算机上将一个大小为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:这有效!非常感谢!
答案 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?