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

时间:2016-07-29 09:32:06

标签: java url networking urlconnection

众所周知,这两个代码都会产生相同的结果

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()?

的重点是什么

3 个答案:

答案 0 :(得分:3)

这个方法可能是javadoc有帮助:

  

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

     

返回URLConnection实例,该实例表示与URL引用的远程对象的连接。一个新的实例   每次调用时都会创建URLConnection   协议处理程序的URLStreamHandler.openConnection(URL)方法   对于此网址。

     

应该注意的是URLConnection实例没有建立   创建时的实际网络连接。这种情况只会发生在   致电URLConnection.connect()

     

如果对于URL的协议(例如HTTP或JAR),则存在   公共的,专门的URLConnection子类属于其中一个   以下包或其中一个子包:java.langjava.io,   java.utiljava.net,返回的连接将是该子类。   例如,对于HTTP,将返回HttpURLConnection,并且   JAR将返回JarURLConnection

如果要为连接添加一些特定的连接属性,请使用此选项。

例如:

URLConnection urlConnection = google.openConnection();

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

答案 1 :(得分:2)

由于openStream()的代码是:

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

这似乎确实很多余。

但如果我是你,如果我openConnection() d,那么我会在返回的InputStream上获得URLConnection

答案 2 :(得分: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);