在Java 7下执行以下操作时,程序挂起。但是,它不会挂在Java 6下。
package pkg;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
final public class Main
{
public static void main(String[] args)
{
try
{
URL url = new URL("http://en.wikipedia.org/wiki/Cancer");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while((line = in.readLine())!= null)
{
System.out.println(line);
}
in.close();
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
可能是什么原因?
答案 0 :(得分:1)
不保证代码在任何版本的Java下工作。你可能对特定的Java运行时运气不错。问题是你试图缓冲来自网络的输入,这可能会挂起。在使用BufferedReader
网络连接或System.in
之前,必须将缓冲区大小设置为1(有效关闭缓冲);否则read()
调用可能会暂停尝试缓冲不可用的输入,并且可能永远不可用。请参阅BufferedReader
构造函数的(新)第二个参数:
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()), 1);
答案 1 :(得分:0)
您需要设置ReadTimeout以防止连接挂起。
如果连接出现任何问题,Java getInputStream方法将阻塞,并且调用它的线程将锁定。
如果getInputStream方法超时,con.setReadTimeout方法会抛出Read Timeout Exception,并保存当天。
URL urlObj = new URL(url);
con = urlObj.openConnection();
con.setConnectTimeout(1000);
con.setReadTimeout(2000);//This is to prevent url connection hangs
con.setRequestProperty("Connection", "close");
con.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));