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

5

我们都知道这两个代码将产生相同的结果。

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

and

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()有什么意义呢?
3个回答

3

也许这个方法的javadoc可以帮助你:

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

返回一个表示与由URL引用的远程对象连接的URLConnection实例。每次调用此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);

1
能否多次调用 openConnection() 方法? - user6538026
当然,你想要多少就有多少。这就是Javadoc告诉我们的。把它看作是你URL的新“传输方式”。 - ar4ers

2

由于openStream()的代码如下:

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

这似乎很冗余。

但如果我是你,如果我openConnection()了,那么我会从返回的URLConnection获取InputStream


2

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接