关闭时java输入流挂起

时间:2016-09-17 23:06:08

标签: java

我需要知道可能导致InputStream无限期挂起close的原因。这是我的代码。

URL url = new URL("ftp://..");
InputSream is = url.openStream();
BufferedReader reader = new InputStreamReader(new GZIPInputStream(is));

try{
    while(true){
        if(reader.readline() == null){
            break;
        }
    }
}catch(Exception e){
    e.printStackTrace();
} finally{
    System.out.println("Closing reader");
    is.close(); // sometimes hangs indefinitely
    System.out.println("Reader closed");
}

结束InputStreamBufferedReader具有相同的效果。

1 个答案:

答案 0 :(得分:0)

  

我需要知道什么可能导致InputStream无限期挂起

我认为这是您正在使用的特定输入流的本质。

您有一个流可以从FTP服务器读取文件。根据Java客户端上使用的协议驱动程序,当您close()文件时,它可能正在尝试关闭活动的FTP会话。这可能涉及与远程服务器交换网络数据包,如果存在网络问题或服务器已经死亡,那么这可能需要很长时间。 ...取决于网络超时的设置时间等等。

它也可能是这样的:

我建议您在close()中挂起连接时捕获线程堆栈跟踪,然后深入研究Java代码库以确定挂起的确切位置。 (如果没有具体证据,有太多可能发生问题的地方进行调查。)

还尝试从堆栈中删除GZIPInputStream以查看是否有任何区别。

最后,如果您向我们提供更多证据,请告诉我们您使用的精确Java版本以及FTP服务器的真实URL。