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的主要内容,如果未能解决你的问题,请参考以下文章
Java Http(s)URLConnection java.io.IOException:服务器返回 HTTP 响应代码:403