簡體   English   中英

是否真的有必要使用url.openConnection()?

[英]Is it really necessary to use url.openConnection()?

眾所周知,這兩個代碼都會產生相同的結果

public class MainApp {
    public static void main(String[] args) throws IOException {
        URL google = new URL("http://www.google.com");
        google.openConnection();
        BufferedReader reader = new BufferedReader(new InputStreamReader(google.openStream()));
        reader.lines().forEach(System.out::println);
    }
}

public class MainApp {
    public static void main(String[] args) throws IOException {
        URL google = new URL("http://www.google.com");
        BufferedReader reader = new BufferedReader(new InputStreamReader(google.openStream()));
        reader.lines().forEach(System.out::println);
    }
}

那么使用google.openConnection()?

可能是這個方法的javadoc有幫助:

public java.net.URLConnection openConnection() throws java.io.IOException

返回一個URLConnection實例,該實例表示與URL引用的遠程對象的連接。 每次調用此URL的協議處理程序的URLStreamHandler.openConnection(URL)方法時,都會創建一個新的URLConnection實例。

應該注意, URLConnection實例在創建時不建立實際的網絡連接。 只有在調用URLConnection.connect()時才會發生這種情況。

如果對於URL的協議(例如HTTP或JAR),存在屬於以下包之一或其子包之一的公共專用URLConnection子類: java.langjava.iojava.utiljava.net ,返回的連接將是該子類。 例如,對於HTTP,將返回HttpURLConnection ,對於JAR,將返回JarURLConnection

如果要為連接添加一些特定的連接屬性,請使用此選項。

例如:

URLConnection urlConnection = google.openConnection();

urlConnection.setReadTimeout(1000);
urlConnection.setConnectTimeout(1000);

由於openStream()的代碼是:

public final InputStream openStream() throws java.io.IOException {
    return openConnection().getInputStream();
}

這看起來確實很多余。

但如果我是你,如果我是openConnection() d,那么我會在返回的URLConnection上獲取InputStream

openConnection() 修改URL對象,它返回一個URLConnection情況下,你可以再使用。 問題中的代碼忽略了openConnection()的返回值,因此,在這種情況下,它確實毫無意義。 只有在您對此連接對象實際執行某些操作時才會有用,例如,修改其超時:

URL google = new URL("http://www.google.com");
URLConnection conn = google.openConnection();
conn.setTimeout(7); // just an example 
BufferedReader reader = 
    new BufferedReader(new InputStreamReader(conn.getInputStream()));
reader.lines().forEach(System.out::println);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM