解析 URL、URN、URI 的不同:网络世界的标识密码

124 阅读2分钟

在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: 通用的资源标识符,可以是URLURN
  • URL: 一种具体的URI,用于定位和访问资源。
  • URN: 一种具体的URI,用于唯一标识资源,但不定位资源。