Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:意外的InputStream行为_Java_Url_Jar_Inputstream - Fatal编程技术网

Java:意外的InputStream行为

Java:意外的InputStream行为,java,url,jar,inputstream,Java,Url,Jar,Inputstream,我在电脑上上传了一个大小为21KB的JAR文件到一个网站上。我找到了指向该JAR文件的直接链接,并创建了指向该文件的InputStream: URL url = new URL("addresstofile"); InputStream stream = url.openStream(); 预计流中可用的字节数约为21000。然而,可用金额为7048。在尝试调试时,我将这些7048字节保存在一个字节数组中,然后将这些字节写入一个扩展名为“.jar”的临时文件 我提取JAR文件中的类(即7KB;

我在电脑上上传了一个大小为21KB的JAR文件到一个网站上。我找到了指向该JAR文件的直接链接,并创建了指向该文件的InputStream:

URL url = new URL("addresstofile");
InputStream stream = url.openStream();
预计流中可用的字节数约为21000。然而,可用金额为7048。在尝试调试时,我将这些7048字节保存在一个字节数组中,然后将这些字节写入一个扩展名为“.jar”的临时文件

我提取JAR文件中的类(即7KB;原始文件为21KB)。除了我注意到嵌套类不存在之外,大多数类都存在。我不知道为什么会这样——InputStream只是在那里被截断,这是巧合吗?还是嵌套类有一些特殊的异常

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


@尼尔:这很管用!非常感谢

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

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

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

预计流中可用的字节数 大约是21000

为什么?


您怎么可能知道在不阻塞的情况下可以读取的字节数是21000?

只有在调用
read()
返回-1时,流才会结束。忽略
available()
方法。这真的没什么用处。因为我的计算机上的文件是21KB。@MartinTuskevicius,是吗?您如何知道I/O系统可以在不阻塞的情况下读取所有这些内容?我的问题旨在让您考虑available()方法的实际定义,并认识到它不是指定为返回流的总长度。事实上,Javadoc中有一个特别的警告。
int b;
while ((b = stream.read()) != -1)
{
    data[length++] = (byte) b;
}