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
相关文章
|
4天前
|
安全 网络协议 Java
Java 网络编程详解
《Java网络编程详解》深入浅出地讲解了使用Java进行网络编程的技术和方法。从基础的网络协议介绍到核心的Socket编程,以及高级的NIO与多线程应用,帮助读者全面掌握Java网络编程技能,是Java开发者不可或缺的学习指南。
|
16天前
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
89 4
|
2月前
|
Java
Java通过HttpClient从外部url下载文件到本地
该Java程序旨在通过URL将外部网络文件(如图片)下载至本地,并解决防盗链问题。首先,它通过`HttpGet`请求获取远程文件,并通过设置`Referer`头防止防盗链。然后,根据响应内容类型确定文件后缀并保存至指定路径。测试表明,程序能够成功下载文件。
230 8
Java通过HttpClient从外部url下载文件到本地
|
1月前
|
数据采集 存储 前端开发
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
|
2月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
80 0
|
3天前
|
SQL 安全 算法
网络安全与信息安全的全面解析:应对漏洞、加密技术及提升安全意识的策略
本文深入探讨了网络安全和信息安全的重要性,详细分析了常见的网络安全漏洞以及其利用方式,介绍了当前流行的加密技术及其应用,并强调了培养良好安全意识的必要性。通过综合运用这些策略,可以有效提升个人和企业的网络安全防护水平。
|
4天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益严重。本文将从网络安全漏洞、加密技术和安全意识三个方面,探讨如何保护个人信息和网络安全。我们将通过实例分析,了解网络攻击者如何利用安全漏洞进行攻击,以及如何运用加密技术防止数据泄露。同时,我们还将讨论提高个人和企业的安全意识的重要性。
|
3天前
|
安全 网络安全 区块链
网络安全与信息安全:构建数字世界的防线在当今数字化时代,网络安全已成为维护个人隐私、企业机密和国家安全的重要屏障。随着网络攻击手段的不断升级,从社交工程到先进的持续性威胁(APT),我们必须采取更加严密的防护措施。本文将深入探讨网络安全漏洞的形成原因、加密技术的应用以及提高公众安全意识的重要性,旨在为读者提供一个全面的网络安全知识框架。
在这个数字信息日益膨胀的时代,网络安全问题成为了每一个网民不可忽视的重大议题。从个人信息泄露到企业数据被盗,再到国家安全受到威胁,网络安全漏洞如同隐藏在暗处的“黑洞”,时刻准备吞噬掉我们的信息安全。而加密技术作为守护网络安全的重要工具之一,其重要性不言而喻。同时,提高公众的安全意识,也是防范网络风险的关键所在。本文将从网络安全漏洞的定义及成因出发,解析当前主流的加密技术,并强调提升安全意识的必要性,为读者提供一份详尽的网络安全指南。
|
2天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
本文将介绍网络安全和信息安全的基本概念,以及它们在现代社会中的重要性。我们将探讨网络安全漏洞的类型和影响,加密技术的作用和分类,以及如何提高个人和组织的安全意识。文章还将通过代码示例来说明一些常见的安全漏洞和攻击方式,并提供相应的防御策略。希望读者能够通过本文了解网络安全和信息安全的基本原理,增强自身的安全意识,并采取有效的措施保护自己的信息安全。
15 1
|
2天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全的技术探讨
在当今数字化时代,云计算和网络安全已成为企业和个人用户不可或缺的技术。本文将深入探讨云计算的基本概念、云服务类型、网络安全的重要性、信息安全的关键要素以及如何确保数据安全。通过分析这些技术领域的发展趋势和挑战,我们将为读者提供关于如何在云环境中保护数据安全的实用建议。