Java 网络编程:必知必会的 URL 和 URLConnection

简介: Java 网络编程:必知必会的 URL 和 URLConnection

java.net.URL 类将 URL 地址进行了封装,并提供了解析 URL 地址的基本方法,比如获取 URL 的主机名和端口号。java.net.URLConnection 则代表了应用程序和 URL 之间的通信链接,可用于读取和写入此 URL 引用的资源。


URLConnection 看起来只是比 URL 多了一个 Connection,它们之间的关系也仅限于此吗?


01、什么是 URL


为了搞清楚什么是 URL,需要引入另外两个概念 URI 和 URN。


什么鬼,URL 都没搞清楚,又来两个搞不清楚的?别担心,我能像变了魔法一样让大家把三个都搞清楚。


URI = Universal Resource Identifier,中文释义为统一资源标志符

URL = Universal Resource Locator,中文释义为统一资源定位符

URN = Universal Resource Name,中文释义为统一资源名称

它们之间的关系如下图所示:



这图啥意思啊,怎么办呢?张小敬有问题就去问葛佬,咱不会就去问“维基百科”啊。


URI 可以分为 URL 和 URN,或者是 URL 和 URN 的结合体(同时具备 Locator 和 Name)。URN 就好像一个人的名字,URL 就像一个人的地址。换句话说:URN 确定了身份,URL 提供了找到它的方式。

概念清晰了吧?URI 是一个纯粹的句法结构,用于指定标识 Web 资源的字符串的各个不同部分。URL 是 URI 的一个特例,包含了定位 Web 资源的足够多的信息。URI 是统一资源标识符,而 URL 是统一资源定位符。URL 是 URI 的一种,比如:http://www.itmind.net/。但不是所有的 URI 都是 URL,因为 URI 可能包括一个子集,即统一资源名称 (URN,命名了资源但不指定如何定位资源),比如说:mailto:qing_gee@163.com。


吧啦吧啦说这么多挺累的,来一发实例吧,用于获取 URL 的主机名和端口号。

URL url = new URL("http://www.itmind.net/category/payment-selection/zhishixingqiu-jingxuan/");
System.out.println("host: " + url.getHost());
System.out.println("port: " + url.getPort());
System.out.println("uri_path: " + url.getPath());
// 输出
// host: www.itmind.net



1)创建 java.net.URL 对象的方法非常简单,只需要一行代码。


URL url = new URL(URL地址);

1

URL 对象是不可变的,因为 URL 类是 final 类型的,这样的好处就是保证它是"线程安全"的。


2)有了 java.net.URL 对象后,就可以获取 URL 相关的主机名、端口、路径等等。


url.getHost()

url.getPort()

url.getPath()



02、什么是 URLConnection


URLConnection 是一个抽象类,代表应用程序和 URL 之间的通信链接。它的实例可用于读取和写入此 URL 引用的资源。该类提供了比 Socket 类更易于使用、更高级的网络连接抽象。


怎么获取 URLConnection 对象呢?通过 URL 对象的 openConnection() 方法,示例如下。


URL url = new URL("http://www.itmind.net");

URLConnection connection = url.openConnection();

1

2

如果 URL 协议为 HTTP 的话,返回的连接为 URLConnection 的子类 HttpURLConnection。


有了 URLConnection 对象后,可以通过 getInputStream() 返回一个 InputStream,由此读取 URL 所引用的资源数据(如果读取 ASCII 文本则为 ASCII;如果读取 HTML 文件则为原始 HTML,如果读取图像文件则为二进制图片数据等)。


我们来尝试读取一下小白学堂首页的内容,代码示例如下。


URL url = new URL("http://www.itmind.net");
URLConnection connection = url.openConnection();
try (InputStream in = connection.getInputStream();) {
  ByteArrayOutputStream output = new ByteArrayOutputStream();
  byte[] buffer = new byte[1024];
  int len = -1;
  while ((len = in.read(buffer)) != -1) {
  output.write(buffer, 0, len);
  }
  System.out.println(new String(output.toByteArray()));
} catch (IOException e) {
  e.printStackTrace();
}



可以使用 try-with-resource 获取 InputStream,该类实现了 AutoCloseable 接口,可以在内容读取完毕后自动关闭输入流。


打印的内容如下图所示(部分):



如果你想读取某个 URL 的内容,上述方法是一个不错的方案,赶快去试试吧!


03、URL 和 URLConnection 的不同


URL 和 URLConnection 最大的不同在于:


URLConnection 提供了对 HTTP 头部的访问;

URLConnection 可以配置发送给某个 URL 的请求参数;

URLConnection 不仅可以读取 URL 定位的资源,还可以向其写入数据。

获取 HTTP 头部的方法有以下一些:


getContentType,返回 Content-type 头字段的值,即数据的 MIME 内容类型。若类型不可用,则返回 null。如果内容类型是文本,则 Content-type 首部可能会包含一个标识内容编码方式的字符集,例如:Content-type:text/html; charset=UTF-8


getContentLength(),返回 Content-length 头字段的值,即内容的字节数。


getContentEncoding(),返回 Content-encoding 头字段的值,即内容的编码方式(不同于字符编码方式),例如:x-gzip。


getDate(),返回 date 头字段的值,即请求的发送时间。


getExpiration(),返回 expires(过期时间) 头字段的值。如果返回 0,表示不过期,永远缓存。


getLastModified(),返回 last-modified(上次修改日期) 头字段的值。


代码示例如下。


URL url = new URL("http://www.itmind.net");
URLConnection connection = url.openConnection();
System.out.println(connection.getContentType());
System.out.println(connection.getContentLength());
System.out.println(connection.getContentEncoding());
System.out.println(connection.getDate());
System.out.println(connection.getExpiration());
System.out.println(connection.getLastModified());
// 输出
// text/html; charset=UTF-8
// -1
// null
// 1566886980000
// 0
// 0
相关文章
|
9天前
|
安全 Java 网络安全
深入理解Java异常处理网络安全与信息安全:保护数据的关键策略
【4月更文挑战第29天】本文将深入探讨Java中的异常处理机制,包括异常的概念、分类、捕获和处理等方面。通过详细的解析和实例演示,帮助读者更好地理解Java异常处理的原理和应用。 【4月更文挑战第29天】在数字化时代,数据成为最宝贵的资产之一。随着网络攻击的日益猖獗,了解并实施有效的网络安全和信息保护措施变得至关重要。本文将深入探讨网络安全漏洞的概念、加密技术的重要性以及提升个人和企业的安全意识的必要性。我们将分析当前的安全挑战,并提供一系列实用的防护策略,旨在帮助读者构建一个更加安全的数字环境。
|
11天前
|
网络协议 Java 网络架构
Java基础教程(18)-Java中的网络编程
【4月更文挑战第18天】Java网络编程简化了底层协议处理,利用Java标准库接口进行TCP/IP通信。TCP协议提供可靠传输,常用于HTTP、SMTP等协议;UDP协议则更高效但不保证可靠性。在TCP编程中,ServerSocket用于监听客户端连接,Socket实现双进程间通信。UDP编程中,DatagramSocket处理无连接的数据报文。HTTP编程可以通过HttpURLConnection发送请求并接收响应。
|
19天前
|
监控 网络协议 Java
《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)
《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)
23 0
《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)
|
19天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
20天前
|
JavaScript Java 测试技术
基于Java的网络办公系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络办公系统的设计与实现(源码+lw+部署文档+讲解等)
23 0
|
21天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
23天前
|
JavaScript Java 测试技术
基于Java的网络游戏交易系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络游戏交易系统的设计与实现(源码+lw+部署文档+讲解等)
29 0
|
2月前
|
网络协议 算法 Java
|
4月前
|
Java 数据格式
最新Java基础系列课程--Day15-网络编程(三)
最新Java基础系列课程--Day15-网络编程
|
4月前
|
存储 网络协议 Java
最新Java基础系列课程--Day15-网络编程(二)
最新Java基础系列课程--Day15-网络编程