我需要知道可能导致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");
}
结束InputStream
或BufferedReader
具有相同的效果。
答案 0 :(得分:0)
我需要知道什么可能导致InputStream无限期挂起
我认为这是您正在使用的特定输入流的本质。
您有一个流可以从FTP服务器读取文件。根据Java客户端上使用的协议驱动程序,当您close()
文件时,它可能正在尝试关闭活动的FTP会话。这可能涉及与远程服务器交换网络数据包,如果存在网络问题或服务器已经死亡,那么这可能需要很长时间。 ...取决于网络超时的设置时间等等。
它也可能是这样的:
我建议您在close()
中挂起连接时捕获线程堆栈跟踪,然后深入研究Java代码库以确定挂起的确切位置。 (如果没有具体证据,有太多可能发生问题的地方进行调查。)
还尝试从堆栈中删除GZIPInputStream以查看是否有任何区别。
最后,如果您向我们提供更多证据,请告诉我们您使用的精确Java版本以及FTP服务器的真实URL。