InputStream 连接到 URL 但不返回任何内容

Posted

技术标签:

【中文标题】InputStream 连接到 URL 但不返回任何内容【英文标题】:InputStream connects to URL but returns nothing 【发布时间】: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。跨度> 好的。因为一切都是例外。不是我能记住它们,对不起。 【参考方案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;
   

【讨论】:

这无济于事 - 请参阅我上面的答案。 试试看,为什么?这包含什么有益的变化?你必须解释。仅有代码是不够的。这里没有什么能解决根本问题。

以上是关于InputStream 连接到 URL 但不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章

Meteor 无法连接到 MongoDB

InputStream的read方法

nodejs socket.io - 连接到服务器但发射不做任何事情

如何使用luasocket连接到url地址?

Windows 多显示器:当目标可用但不活动时,如何确定目标是不是物理连接到源?

PayPal IPN 模拟器:尝试连接到 URL 时出现问题。请检查网址并重试