【问题标题】:URLConnection returning empty inputStreamURLConnection 返回空的 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 文件
  • 你在哪个操作系统上工作?

标签: java url inputstream httpurlconnection urlconnection


【解决方案1】:

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

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

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

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

    // Do something here with buffer
}

read() 是一种阻塞方法。

【讨论】:

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

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

请阅读它直到流结束。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我不想下载该文件。我只想打开它,检索inputstream 并从中获取字节。
    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2011-07-22
    • 2016-08-26
    • 2016-06-11
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多