Java 7 URL连接挂起

时间:2012-04-15 00:03:26

标签: java java-7

在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();
        }
    }
}

可能是什么原因?

2 个答案:

答案 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()));