URLConnection返回空的inputStream。

3

我正在尝试从URL Connection获取输入流的PDF,但是我得到了一个空的输入流。请问有谁能告诉我我做错了什么?以下是代码:

<!-- language: java -->

URL fileUrl = new URL("https://www.dropbox.com/s/ao3up7xudju4qm0/Amalgabond%20Adhesive%20Agent.pdf");
HttpURLConnection connection = (HttpURLConnection)fileUrl.openConnection();
connection.connect(); 
InputStream is = connection.getInputStream();
Log.i("TAG", "is.available(): " + is.available());

is.available() 返回了 0 表示流为空。


我卡在这里了。我不知道为什么有时候会得到 0 或者 1 - Mustansar Saeed
你之前尝试过在浏览器中输入这个URL吗? - slaadvak
你正在使用哪个操作系统? - slaadvak
让我们在聊天中继续这个讨论 - slaadvak
相关链接:https://dev59.com/u3A65IYBdhLWcg3wrQh4#3695378 - AlikElzin-kilaka
显示剩余4条评论
3个回答

3
根据javadoc文档,available()不会阻塞并等待所有数据都可用,因此当调用该方法时,您可能尚未完全接收到所需内容。
相比于使用available(),您应该使用以下代码:
int bytesRead;
byte[] buffer = new byte[100000];

while((bytesRead = is.read(buffer)) > 0){

    // Do something here with buffer
}

read() 是一个阻塞方法。


如何使用此缓冲区打印内容? - Mustansar Saeed
如果你想打印文字,你可以使用扫描仪来完成:https://dev59.com/UHVC5IYBdhLWcg3wZwJT#5445161 - slaadvak
为什么在执行 is.available() 时会得到字节? - Mustansar Saeed
也许是因为我的互联网连接延迟比你的小,所以当我调用 available() 时从流中读取了更多字节。 - slaadvak
@slaadvak 这是一个PDF文件。你不能在上面使用Scanner。 - user207421
显示剩余2条评论

0
你误用了available()方法。它并不告诉你输入流的长度,所以它返回零并不表示它是空的。请查看Javadoc,其中明确说明了所有这些内容。
只需读取到流的末尾即可。

0
如果您的最终目标是从Dropbox下载文件,您应该使用 Dropbox Java API,或者使用这个更简单的解决方案。否则,对于在Dropbox上的文件,使用URLConnection将会下载一个网页(HTML格式),其中显示了一个链接供您点击(还有很多其他内容!)以便下载您的文件。

我不想下载文件,只想打开它,检索“inputstream”并从中提取字节。 - Mustansar Saeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接