【问题标题】:InputStream connects to URL but returns nothingInputStream 连接到 URL 但不返回任何内容
【发布时间】:2016-02-23 17:33:56
【问题描述】:

我将 InputStream 设置为在线托管的原始文本文件的 url。每一行都是不同的说法,方法应该是从文件中获取文本并将其保存到缓存文件夹以供应用程序使用。连接到 URL 没有问题,否则它会在日志中给出 FileNotFoundException(测试过),并且生成了缓存文件,但它没有将任何内容保存到缓存文件(有权限,也测试过)。是什么导致这种情况发生?

从页面读取的代码:

protected Void doInBackground(Void... Params) {
    try {
        File quote = new File("Absolute path to cache");
        URL url = new URL("URL of file");
        InputStream is = url.openStream();
        OutputStream os = new FileOutputStream(quote);
        byte[] buffer = new byte[is.available()];
        is.read(buffer);
        os.write(buffer);
        is.close();
        os.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

【问题讨论】:

  • available() 的经典误用,在 Javadoc 中被特别警告。
  • '连接到 URL 没有问题,否则会给出 FileNotFoundException'。不,那会产生 SocketTimeoutException。
  • @greenapps 不正确。如果连接失败,它会给出一个ConnectException,如果 HTP 状态是 404,它会给出一个 FileNotFoundException,这两者都是 URL 的问题,如果他设置了读取超时并且它被触发,它会给出一个 SocketTimeoutException。跨度>
  • 好的。因为一切都是例外。不是我能记住它们,对不起。

标签: java android url inputstream


【解决方案1】:

根据连接,is.available() 可能可用也可能不可用 - 函数将返回零,导致您不向输出流写入任何内容。

执行此操作的最佳方法是读取直到无法读取更多数据 - 例如见here

【讨论】:

  • 哦,我明白了。现在我明白了。不过,我只是使用了一个固定的 1024 字节缓冲区,而不是您的实现。完美运行,谢谢
【解决方案2】:

试试这个。

@Override
   protected void doInBackground(Void... Params) {
      try{
        File quote = new File("Absolute path to cache");
        URL url = new URL("URL of file");
        HttpURLConnection httpCon =
      (HttpURLConnection) url.openConnection();

       if(httpCon.getResponseCode() != 200)
          throw new Exception("Failed to connect");
       }

       InputStream is = httpCon.getInputStream();
       OutputStream os = new FileOutputStream(quote);
       byte[] buffer = new byte[is.available()];
       is.read(buffer);
       os.write(buffer);
       is.close();
       os.close();

       }catch(Exception e){
         e.printTrackTrace();
       }
       return null;
   }

【讨论】:

  • 这无济于事 - 请参阅我上面的答案。
  • 试试看,为什么?这包含什么有益的变化?你必须解释。仅有代码是不够的。这里没有什么能解决根本问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2021-05-10
  • 1970-01-01
  • 2013-12-07
  • 2018-01-13
相关资源
最近更新 更多