URLConnection 返回空的 inputStream

Posted

技术标签:

【中文标题】URLConnection 返回空的 inputStream【英文标题】:URLConnection returning empty inputStream 【发布时间】:2014-06-03 09:01:55 【问题描述】:

我正在尝试从 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 空流。

【问题讨论】:

它在这里工作得很好,is.availbale() 返回 15595 字节。 我被困在这个问题上。我不知道为什么我会收到 0 或有时会收到 1 你之前用浏览器试过这个网址吗? 是的浏览器正在显示带有此 url https://www.dropbox.com/s/ao3up7xudju4qm0/Amalgabond%20Adhesive%20Agent.pdf 的 pdf 文件 你在哪个操作系统上工作? 【参考方案1】:

根据 javadoc,available() 不会阻塞并等待所有数据可用,因此在调用它时您可能还没有完全收到您的东西。

你应该使用这样的东西而不是 available() :

int bytesRead;
byte[] buffer = new byte[100000];

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

    // Do something here with buffer

read() 是一种阻塞方法。

【讨论】:

如何使用这个缓冲区打印内容? 如果你想打印文本,你可以用扫描仪来代替:***.com/a/5445161/3183264 为什么当你做is.available()时得到字节? 也许,因为我的 Internet 连接的延迟比你的少,所以当我调用 available() 时,从流中读取的字节数更多。 @slaadvak 这是一个 PDF。你不能在上面使用扫描仪。【参考方案2】:

您误用了 available() 方法。它不会告诉您输入流的长度,因此它返回零的事实并不表示它是空的。请参阅 Javadoc,其中明确说明了所有这些内容。

请阅读它直到流结束。

【讨论】:

【参考方案3】:

如果您的最终目标是从 Dropbox 下载文件,您应该使用Dropbox Java API,或者这个simpler solution。否则,Dropbox 上文件的 URLConnection 会下载一个网页(html 格式),显示一个链接供您单击(还有很多其他内容!)以下载您的文件。

【讨论】:

我不想下载该文件。我只想打开它,检索inputstream 并从中获取字节。

以上是关于URLConnection 返回空的 inputStream的主要内容,如果未能解决你的问题,请参考以下文章

使用URLConnection获取页面返回的xml数据

停止验证后返回空的PHP表单输入

5URLConnection

Java Http(s)URLConnection java.io.IOException:服务器返回 HTTP 响应代码:403

training.test.split 返回空的训练集

URLConnection.getURL 方法