2012-03-04 91 views
1

我上传了一个JAR文件,该文件在我的计算机上的大小为21 KB,可以上传到网站。我发现直接链接到该JAR文件,并创建一个InputStream该文件:Java:意外的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:This Works!非常感谢!

+0

流只在对'read()'的调用返回-1时结束。忽略'available()'方法。这真的没有多大用处。 – erickson 2012-03-04 22:13:38

回答

2

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

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

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

非常好!这工作! – 2012-03-04 22:50:57

1

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

0

将预期的字节流 中可用的量会〜21000

为什么?

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

+0

因为我的电脑上的文件是21 KB。 – 2012-03-05 00:41:49

+0

@MartinTuskevicius所以?你怎么知道I/O系统可以不受阻塞地读取所有内容?我的问题是为了让你考虑available()方法的* actual *定义,并意识到它没有被指定返回流的总长度。事实上,在Javadoc中有一个具体的警告。 – EJP 2012-03-05 00:44:25