在Java编程中,URL(Uniform Resource Locator)和 URI(Uniform Resource Identifier)是两个常用的类,它们虽然有些相似,但代表了不同的概念。以下是它们的区别以及各自的特点。
1. 基本定义
- URI(统一资源标识符) : URI 是一个更广泛的概念,用来标识一个互联网资源。它可以是一个 URL,也可以是一个 URN(Uniform Resource Name)。
- URL(统一资源定位符) : URL 是一个特定类型的 URI,用于定位互联网上的资源,通常包含协议、主机名、端口号、路径等信息。
- URN(Uniform Resource Name):是一种具体的URI,用于唯一标识资源,但不提供资源的访问方法。
2. 结构组成
-
URI 的一般结构:
[scheme:][//authority][path][?query][#fragment]示例:
http://www.example.com:8080/docs/resource1.html?name=value#section urn:isbn:0451450523 -
URL 是一种具体的 URI,其结构通常包含:
protocol://host:port/path?query#fragment示例:
http://www.example.com:8080/docs/resource1.html?name=value#section ftp://ftp.example.com/resource.txt -
URN的格式
urn:<namespace identifier>:<namespace-specific string>
- namespace identifier: 命名空间标识符,用于定义一组命名规则。
- namespace-specific string: 命名空间特定字符串,是在指定命名空间下的资源标识符。
例如,一个图书的ISBN号可以表示为URN:
urn:isbn:0451450523
3. 使用场景
URI: 用于表示任何形式的统一资源标识符,包括但不限于 URL。例如,一个 URN 也可以是一个 URI。
URI 示例
import java.net.URI;
public class URIDemo {
public static void main(String[] args) throws Exception {
URI uri = new URI("http://www.example.com:8080/docs/resource1.html?name=value#section");
System.out.println("Scheme: " + uri.getScheme()); // http
System.out.println("Host: " + uri.getHost()); // www.example.com
System.out.println("Path: " + uri.getPath()); // /docs/resource1.html
}
}
URL: 用于定位互联网上的资源,并且往往可以打开连接到该资源以进行读写操作。
URL 示例
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class URLDemo {
public static void main(String[] args) throws Exception {
URL url = new URL("http://www.example.com:8080/docs/resource1.html?name=value#section");
try (BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(input
URN 示例
2. Java中的 URN
虽然Java标准库中没有专门的URN类,但我们可以使用URI类来处理URN,因为URN是URI的一种。以下是处理URN的示例代码:
import java.net.URI;
public class URNDemo {
public static void main(String[] args) throws Exception {
URI uri = new URI("urn:isbn:0451450523");
// 检查是否为URN
if ("urn".equalsIgnoreCase(uri.getScheme())) {
System.out.println("这是一个URN");
System.out.println("Namespace Identifier: " + uri.getSchemeSpecificPart());
} else {
System.out.println("这不是一个URN");
}
}
}
上述代码中,我们创建了一个URI对象,并检查其方案部分是否为"urn"。如果是,则表明这个URI是一个URN,并打印出命名空间特定字符串。
总结
- URI: 通用的资源标识符,可以是
URL或URN。 - URL: 一种具体的URI,用于定位和访问资源。
- URN: 一种具体的URI,用于唯一标识资源,但不定位资源。