広告

Java : URL - API使用例

URL (Java SE 21 & JDK 21) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様書のおともにどうぞ。


概要

URLクラスは、Uniform Resource Locator (ユニフォーム・リソース・ロケータ)、つまりWorld Wide Web上の「リソース」へのポインタを表します。 リソースは、ファイルやディレクトリのような単純なものであることも、データベースや検索エンジンに対するクエリーなど、より複雑なオブジェクトへの参照であることもあります。

クラス構成

関連するクラスとして URIクラスがあります。
Java API 使用例 : URI」も参考にしていただけたら幸いです。

final var url = URI.create("https://example.com/java/index.html").toURL();
System.out.println(url); // "https://example.com/java/index.html"
System.out.println(url.getProtocol()); // "https"
System.out.println(url.getHost()); // "example.com"
System.out.println(url.getPath()); // "/java/index.html"

コンストラクタ

URL (String spec)

非推奨。 URI.toURL()を使用して、URLのインスタンスを作成します。

非推奨です。

URL (String protocol, String host, int port, String file)

非推奨。 URI.toURL()を使用して、URLのインスタンスを作成します。

非推奨です。

URL (String protocol, String host, int port, String file, URLStreamHandler handler)

非推奨。 of(URI, URLStreamHandler)を使用して、カスタム・プロトコル・ハンドラに関連付けられたURLのインスタンスを構築します。

非推奨です。

URL (String protocol, String host, String file)

非推奨。 URI.toURL()を使用して、URLのインスタンスを作成します。

非推奨です。

URL (URL context, String spec)

非推奨。 URI.toURL()を使用して、URLのインスタンスを作成します。

非推奨です。

URL (URL context, String spec, URLStreamHandler handler)

非推奨。 of(URI, URLStreamHandler)を使用して、カスタム・プロトコル・ハンドラに関連付けられたURLのインスタンスを構築します。

非推奨です。

メソッド

boolean equals (Object obj)

このURLと別のオブジェクトとが等しいかどうかを比較します。

final var url1 = URI.create("http://example.com/docs/resource1.html").toURL();
final var url2 = URI.create("http://example.com/docs/resource1.html").toURL();

System.out.println(url1.equals(url2)); // true
// ホスト名の大文字・小文字の区別はしません。
final var url1 = URI.create("http://example.com/").toURL();
final var url2 = URI.create("HTTP://EXAMPLE.COM/").toURL();

System.out.println(url1.equals(url2)); // true
final var url1 = URI.create("http://example.com/a").toURL();
final var url2 = URI.create("http://example.com/b").toURL();

System.out.println(url1.equals(url2)); // false
// IPアドレスで一致していれば true となります。
final var url1 = URI.create("http://example.com").toURL();
final var url2 = URI.create("http://www.example.com").toURL();

System.out.println(url1.equals(url2)); // true

String getAuthority ()

このURLの機関部分を取得します。

final var url1 = URI.create("http://www.example.com/docs/resource1.html").toURL();
System.out.println(url1.getAuthority()); // "www.example.com"
System.out.println(url1.getHost()); // "www.example.com"

final var url2 = URI.create("http://user-a@example.com:80/").toURL();
System.out.println(url2.getAuthority()); // "user-a@example.com:80"
System.out.println(url2.getHost()); // "example.com"

final var url3 = URI.create("https://example.com/index.html?query#fragment").toURL();
System.out.println(url3.getAuthority()); // "example.com"
System.out.println(url3.getHost()); // "example.com"

final var url4 = URI.create("file:///~/calendar").toURL();
System.out.println(url4.getAuthority()); // ""
System.out.println(url4.getHost()); // ""

final var url5 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(url5.getAuthority()); // null
System.out.println(url5.getHost()); // ""

final Object getContent ()

このURLのコンテンツを取得します。

※どの Content-Type がなんのクラスを返すのか…そのあたりの仕様を見つけられていません。
とりあえず text/html は InputStream を返すようです。
疑問点が解決したら更新するかもです。

final var url = URI.create("http://example.com").toURL();
final var content = url.getContent();

if (content instanceof InputStream is) {
    try (final var reader = new BufferedReader(
            new InputStreamReader(is))) {
        reader.lines().forEach(System.out::println);
    }
}

// 結果
// ↓
//<!doctype html>
//<html>
//<head>
//    <title>Example Domain</title>
// ...
//</html>

final Object getContent (Class<?>[] classes)

このURLのコンテンツを取得します。

final var url = URI.create("http://example.com").toURL();
final Class<?>[] classes = {InputStream.class};

final var content = url.getContent(classes);
if (content instanceof InputStream is) {
    try (final var reader = new BufferedReader(
            new InputStreamReader(is))) {
        reader.lines().forEach(System.out::println);
    }
}

// 結果
// ↓
//<!doctype html>
//<html>
//<head>
//    <title>Example Domain</title>
// ...
//</html>

int getDefaultPort ()

このURLに関連するプロトコルのデフォルトのポート番号を取得します。

final var uri1 = URI.create("http://example.com/").toURL();
System.out.println(uri1.getDefaultPort()); // 80
System.out.println(uri1.getPort()); // -1

final var uri2 = URI.create("http://example.com:9999/").toURL();
System.out.println(uri2.getDefaultPort()); // 80
System.out.println(uri2.getPort()); // 9999

final var uri3 = URI.create("https://example.com/").toURL();
System.out.println(uri3.getDefaultPort()); // 443
System.out.println(uri3.getPort()); // -1

final var uri4 = URI.create("ftp://example.com/").toURL();
System.out.println(uri4.getDefaultPort()); // 21
System.out.println(uri4.getPort()); // -1

final var uri5 = URI.create("file:///~/calendar").toURL();
System.out.println(uri5.getDefaultPort()); // -1
System.out.println(uri5.getPort()); // -1

final var uri6 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(uri6.getDefaultPort()); // -1
System.out.println(uri6.getPort()); // -1

String getFile ()

このURLのファイル名を取得します。

final var url1 = URI.create("http://www.example.com/docs/resource1.html").toURL();
System.out.println(url1.getFile()); // "/docs/resource1.html"
System.out.println(url1.getPath()); // "/docs/resource1.html"

final var url2 = URI.create("https://example.com/index.html?query#fragment").toURL();
System.out.println(url2.getFile()); // "/index.html?query"
System.out.println(url2.getPath()); // "/index.html"

final var url3 = URI.create("http://user-a@example.com:80/").toURL();
System.out.println(url3.getFile()); // "/"
System.out.println(url3.getPath()); // "/"

final var url4 = URI.create("file:///~/calendar").toURL();
System.out.println(url4.getFile()); // "/~/calendar"
System.out.println(url4.getPath()); // "/~/calendar"

final var url5 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(url5.getFile()); // "file:/home/xxx/sample.jar!/sample.txt"
System.out.println(url5.getPath()); // "file:/home/xxx/sample.jar!/sample.txt"

String getHost ()

該当する場合、このURLのホスト名を取得します。

final var url1 = URI.create("http://www.example.com/docs/resource1.html").toURL();
System.out.println(url1.getAuthority()); // "www.example.com"
System.out.println(url1.getHost()); // "www.example.com"

final var url2 = URI.create("http://user-a@example.com:80/").toURL();
System.out.println(url2.getAuthority()); // "user-a@example.com:80"
System.out.println(url2.getHost()); // "example.com"

final var url3 = URI.create("https://example.com/index.html?query#fragment").toURL();
System.out.println(url3.getAuthority()); // "example.com"
System.out.println(url3.getHost()); // "example.com"

final var url4 = URI.create("file:///~/calendar").toURL();
System.out.println(url4.getAuthority()); // ""
System.out.println(url4.getHost()); // ""

final var url5 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(url5.getAuthority()); // null
System.out.println(url5.getHost()); // ""

String getPath ()

このURLのパス部分を取得します。

final var url1 = URI.create("http://www.example.com/docs/resource1.html").toURL();
System.out.println(url1.getFile()); // "/docs/resource1.html"
System.out.println(url1.getPath()); // "/docs/resource1.html"

final var url2 = URI.create("https://example.com/index.html?query#fragment").toURL();
System.out.println(url2.getFile()); // "/index.html?query"
System.out.println(url2.getPath()); // "/index.html"

final var url3 = URI.create("http://user-a@example.com:80/").toURL();
System.out.println(url3.getFile()); // "/"
System.out.println(url3.getPath()); // "/"

final var url4 = URI.create("file:///~/calendar").toURL();
System.out.println(url4.getFile()); // "/~/calendar"
System.out.println(url4.getPath()); // "/~/calendar"

final var url5 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(url5.getFile()); // "file:/home/xxx/sample.jar!/sample.txt"
System.out.println(url5.getPath()); // "file:/home/xxx/sample.jar!/sample.txt"

int getPort ()

このURLのポート番号を取得します。

final var uri1 = URI.create("http://example.com/").toURL();
System.out.println(uri1.getDefaultPort()); // 80
System.out.println(uri1.getPort()); // -1

final var uri2 = URI.create("http://example.com:9999/").toURL();
System.out.println(uri2.getDefaultPort()); // 80
System.out.println(uri2.getPort()); // 9999

final var uri3 = URI.create("https://example.com/").toURL();
System.out.println(uri3.getDefaultPort()); // 443
System.out.println(uri3.getPort()); // -1

final var uri4 = URI.create("ftp://example.com/").toURL();
System.out.println(uri4.getDefaultPort()); // 21
System.out.println(uri4.getPort()); // -1

final var uri5 = URI.create("file:///~/calendar").toURL();
System.out.println(uri5.getDefaultPort()); // -1
System.out.println(uri5.getPort()); // -1

final var uri6 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(uri6.getDefaultPort()); // -1
System.out.println(uri6.getPort()); // -1

String getProtocol ()

このURLのプロトコル名を取得します。

final var url1 = URI.create("http://www.example.com/docs/resource1.html").toURL();
System.out.println(url1.getProtocol()); // "http"

final var url2 = URI.create("https://example.com/index.html?query#fragment").toURL();
System.out.println(url2.getProtocol()); // "https"

final var url3 = URI.create("file:///~/calendar").toURL();
System.out.println(url3.getProtocol()); // "file"

final var url4 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(url4.getProtocol()); // "jar"

String getQuery ()

このURLのクエリー部分を取得します。

final var url1 = URI.create("http://www.example.com/docs/resource1.html").toURL();
System.out.println(url1.getQuery()); // null

final var url2 = URI.create("https://example.com/index.html?query#fragment").toURL();
System.out.println(url2.getQuery()); // "query"

final var url3 = URI.create("https://example.com/index.html?aaa&bbb&ccc").toURL();
System.out.println(url3.getQuery()); // "aaa&bbb&ccc"

final var url4 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(url4.getQuery()); // null

String getRef ()

このURLのアンカー(「参照」とも呼ばれる)を取得します。

final var url1 = URI.create("http://www.example.com/docs/resource1.html").toURL();
System.out.println(url1.getRef()); // null

final var url2 = URI.create("https://example.com/index.html?query#fragment").toURL();
System.out.println(url2.getRef()); // "fragment"

final var url3 = URI.create("https://example.com/#aaaa").toURL();
System.out.println(url3.getRef()); // "aaaa"

final var url4 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(url4.getRef()); // null

String getUserInfo ()

このURLのユーザー情報部分を取得します。

final var url1 = URI.create("http://example.com/").toURL();
System.out.println(url1.getUserInfo()); // null

final var url2 = URI.create("http://user-a@example.com:80/").toURL();
System.out.println(url2.getUserInfo()); // "user-a"

int hashCode ()

ハッシュ表のインデックス付けに適したint値を作成します。

final var url1 = URI.create("http://example.com/").toURL();
final var url2 = URI.create("http://example.com/").toURL();

System.out.println(url1.hashCode()); // 1575608341
System.out.println(url2.hashCode()); // 1575608341
// ホスト名の大文字・小文字の区別はしません。
final var url1 = URI.create("http://example.com/").toURL();
final var url2 = URI.create("HTTP://EXAMPLE.COM/").toURL();

System.out.println(url1.hashCode()); // 1575608341
System.out.println(url2.hashCode()); // 1575608341
final var url1 = URI.create("http://example.com/a").toURL();
final var url2 = URI.create("http://example.com/b").toURL();

System.out.println(url1.hashCode()); // 1575609848
System.out.println(url2.hashCode()); // 1575609849
final var url1 = URI.create("http://example.com").toURL();
final var url2 = URI.create("http://www.example.com").toURL();

System.out.println(url1.equals(url2)); // true
System.out.println(url1.hashCode()); // 1575608294
System.out.println(url2.hashCode()); // 1575608294

static URL of (URI uri, URLStreamHandler handler)

uri.toURL()を起動するかのようにURIからURLを作成しますが、許可されている場合は指定されたURLStreamHandlerに関連付けます。

class DummyURLStreamHandler extends URLStreamHandler {
    @Override
    protected URLConnection openConnection(URL u) {
        System.out.println("dummy : openConnection url = " + u);
        return new URLConnection(u) {
            @Override
            public void connect() {
                System.out.println("dummy : connect!");
            }
        };
    }
}

final var url = URL.of(new URI("http://example.com"),
        new DummyURLStreamHandler());
System.out.println(url); // "http://example.com"

final var connection = url.openConnection();
connection.connect();

// 結果
// ↓
//dummy : openConnection url = http://example.com
//dummy : connect!

URLConnection openConnection ()

URLが参照するリモート・オブジェクトへの接続を表すURLConnectionインスタンスを返します。

final var url = URI.create("http://example.com").toURL();

final var connection = url.openConnection();
try (final var reader = new BufferedReader(
        new InputStreamReader(connection.getInputStream()))) {
    reader.lines().forEach(System.out::println);
}

// 結果
// ↓
//<!doctype html>
//<html>
//<head>
//    <title>Example Domain</title>
// ...
//</html>

URLConnection openConnection (Proxy proxy)

openConnection()と同じですが、指定されたプロキシを介して接続が行われます。プロキシをサポートしないプロトコル・ハンドラは、プロキシ・パラメータを無視し、通常の接続を作成します。

final var url = URI.create("http://example.com").toURL();
final var proxy = new Proxy(Proxy.Type.HTTP,
        new InetSocketAddress("proxy.example.com", 8080));

final var connection = url.openConnection(proxy);
try (final var reader = new BufferedReader(
        new InputStreamReader(connection.getInputStream()))) {
    reader.lines().forEach(System.out::println);
}

// 結果
// ↓
//<!doctype html>
//<html>
//<head>
//    <title>Example Domain</title>
// ...
//</html>

final InputStream openStream ()

このURLへの接続を開き、その接続から読み込むためのInputStreamを返します。

final var url = URI.create("http://example.com").toURL();
try (final var reader = new BufferedReader(
        new InputStreamReader(url.openStream()))) {
    reader.lines().forEach(System.out::println);
}

// 結果
// ↓
//<!doctype html>
//<html>
//<head>
//    <title>Example Domain</title>
// ...
//</html>

boolean sameFile (URL other)

フラグメント・コンポーネント以外の2つのURLを比較します。

final var url1 = URI.create("http://example.com/").toURL();
final var url2 = URI.create("http://example.com/").toURL();

System.out.println(url1.sameFile(url2)); // true
// 参照(フラグメント) は除外して比較されます。
final var url1 = URI.create("http://example.com/#aaa").toURL();
final var url2 = URI.create("http://example.com/#bbb").toURL();

System.out.println(url1.sameFile(url2)); // true
final var url1 = URI.create("http://example.com/?aaa").toURL();
final var url2 = URI.create("http://example.com/?bbb").toURL();

System.out.println(url1.sameFile(url2)); // false
// ホスト名の大文字・小文字の区別はしません。
final var url1 = URI.create("http://example.com/").toURL();
final var url2 = URI.create("HTTP://EXAMPLE.COM/").toURL();

System.out.println(url1.sameFile(url2)); // true
final var url1 = URI.create("http://example.com/a").toURL();
final var url2 = URI.create("http://example.com/b").toURL();

System.out.println(url1.sameFile(url2)); // false
// IPアドレスで一致していれば true となります。
final var url1 = URI.create("http://example.com/").toURL();
final var url2 = URI.create("http://www.example.com/").toURL();

System.out.println(url1.sameFile(url2)); // true

static void setURLStreamHandlerFactory (URLStreamHandlerFactory fac)

アプリケーションのURLStreamHandlerFactoryを設定します。

class DummyURLStreamHandler extends URLStreamHandler {
    @Override
    protected URLConnection openConnection(URL u) {
        System.out.println("dummy : openConnection url = " + u);
        return new URLConnection(u) {
            @Override
            public void connect() {
                System.out.println("dummy : connect!");
            }
        };
    }
}

URL.setURLStreamHandlerFactory(protocol -> {
    System.out.println("createURLStreamHandler! : " + protocol);
    return new DummyURLStreamHandler();
});

final var url = URI.create("http://example.com/").toURL();
final var connection = url.openConnection();
connection.connect();

// 結果
// ↓
//createURLStreamHandler! : http
//dummy : openConnection url = http://example.com/
//dummy : connect!

String toExternalForm ()

このURLの文字列表現を構築します。

final var url1 = URI.create("http://www.example.com/docs/resource1.html").toURL();
System.out.println(url1.toExternalForm()); // "http://www.example.com/docs/resource1.html"

final var url2 = URI.create("https://example.com/index.html?query#fragment").toURL();
System.out.println(url2.toExternalForm()); // "https://example.com/index.html?query#fragment"

final var url3 = URI.create("file:///~/calendar").toURL();
System.out.println(url3.toExternalForm()); // "file:/~/calendar"

final var url4 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(url4.toExternalForm()); // "jar:file:/home/xxx/sample.jar!/sample.txt"

String toString ()

このURLの文字列表現を構築します。

結果は toExternalForm() と同じになります。
API使用例は toExternalForm のメソッドをご参照ください。

結果は同じ。ならどちらを使ったほうがよいのか…

外部サイトですが参考までに。
Is there a semantic difference between toExternalForm and toString on java.net.URL? - Stack Overflow

URI toURI ()

このURLと等価なURIを返します。

final var url1 = URI.create("http://www.example.com/docs/resource1.html").toURL();
System.out.println(url1.toURI()); // "http://www.example.com/docs/resource1.html"

final var url2 = URI.create("https://example.com/index.html?query#fragment").toURL();
System.out.println(url2.toURI()); // "https://example.com/index.html?query#fragment"

final var url3 = URI.create("file:///~/calendar").toURL();
System.out.println(url3.toURI()); // "file:/~/calendar"

final var url4 = URI.create("jar:file:/home/xxx/sample.jar!/sample.txt").toURL();
System.out.println(url4.toURI()); // "jar:file:/home/xxx/sample.jar!/sample.txt"
// エスケープの例。
final var url = URI.create("http://example.com/a%20b%20c/").toURL();
System.out.println(url.toURI()); // "http://example.com/a%20b%20c/"
System.out.println(url.toURI().getPath()); // "/a b c/"

関連記事

ページの先頭へ