从URL java读取

从URL java读取,java,url,timeout,Java,Url,Timeout,我正在尝试用java读取URL,只要URL在浏览器中加载,它就可以工作 但是如果它只是在浏览器中循环,并且在我试图在浏览器中打开页面时没有加载该页面,我的java应用程序就会挂起,如果有足够的时间,它可能会永远等待。如果加载超过20秒导致我停止应用程序,我如何设置超时 我正在使用 以下是守则的相关部分: URL url = null; String inputLine; try { url = new URL(surl); } catch (Ma

我正在尝试用java读取URL,只要URL在浏览器中加载,它就可以工作

但是如果它只是在浏览器中循环,并且在我试图在浏览器中打开页面时没有加载该页面,我的java应用程序就会挂起,如果有足够的时间,它可能会永远等待。如果加载超过20秒导致我停止应用程序,我如何设置超时

我正在使用

以下是守则的相关部分:

    URL url = null;
    String inputLine;

    try {
        url = new URL(surl);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    BufferedReader in;
    try {
        in = new BufferedReader(new InputStreamReader(url.openStream()));
        while ((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
        }
        in.close();

    } catch (IOException e) {
        e.printStackTrace();
    }

如果您正在使用
URLConnection
(或
HttpURLConnection
)来“从url读取”,则有一个
setReadTimeout()
方法可用于控制该操作

发布代码后编辑:

URL url = null;
String inputLine;

try {
    url = new URL(surl);
} catch (MalformedURLException e) {
    e.printStackTrace();
}
BufferedReader in;
try {
    URLConnection con = url.openConnection();
    con.setReadTimeout( 1000 ); //1 second
    in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    while ((inputLine = in.readLine()) != null) {
        System.out.println(inputLine);
    }
    in.close();

} catch (IOException e) {
    e.printStackTrace();
}
该方法实际上只是
openConnection().getInputStream()
的快捷方式。下面是URL类的代码:

public final InputStream openStream() throws java.io.IOException {
  return openConnection().getInputStream();
}
  • 您可以按如下方式调整客户端代码中的设置:

    URLConnection conn = url.openConnection();
    // setting timeouts
    conn.setConnectTimeout(connectTimeoutinMilliseconds);
    conn.setReadTimeout(readTimeoutinMilliseconds);
    InputStream in = conn.getInputStream();
    
参考文献:

  • 或者,您应该将
    sun.net.client.defaultConnectTimeout
    sun.net.client.defaultReadTimeout
    设置为合理的值

    • 我不知道你是如何使用URL类的。如果发布一个片段会更好。但有一种方法对我来说很有效。看看它对你的情况是否有帮助:

          URL url = new URL(urlPath);
          URLConnection con = url.openConnection();
          con.setConnectTimeout(connectTimeout);
          con.setReadTimeout(readTimeout);
          InputStream in = con.getInputStream();
      

      您应该在AndroidMenifest.xml中添加internet权限


      介意发布一些相关的代码吗?我猜你可以使用
      URL
      然后调用
      openConnection()
      ,返回
      URLConnection
      ?好的,我刚刚添加了修改过的代码——我相信你可以通过
      BufferedReader发现这两行新代码和行中的变化
      
      <uses-permission android:name="android.permission.INTERNET" />
      
      if (android.os.Build.VERSION.SDK_INT > 9)
              {
                  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                  StrictMode.setThreadPolicy(policy);
              }