1

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

可能是什么原因?

4

2 回答 2

1

不保证代码可以在任何Java 版本下工作。您可能对特定的 Java 运行时很幸运。问题是您正在尝试缓冲来自网络的输入,这可能会挂起。BufferedReader在使用网络连接或使用System.in;之前,您必须将缓冲区大小设置为 1(有效地关闭缓冲) 。否则read()调用可能会挂起,试图缓冲不可用的输入,并且可能永远不会变得可用。请参阅构造函数的(新)第二个参数BufferedReader

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()), 1);
于 2012-04-15T00:09:52.830 回答
1

您需要设置 ReadTimeout 以防止连接挂起。

如果连接出现任何问题,Java getInputStream 方法将阻塞,调用它的线程将锁定。

如果 getInputStream 方法超时,con.setReadTimeout 方法会抛出读取超时异常,并节省时间。

    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()));
于 2018-02-28T07:30:41.823 回答