Java では、開発者はさまざまな URL プロトコルを利用した汎用性の高いリソース読み込み API にアクセスできます。ただし、「file://」や「http://」などのプロトコルは特定の場所からのリソースの取得を容易にしますが、jar またはクラス フォルダーを明示的に指定せずにアプリケーションのクラスパスからリソースにアクセスする必要がある場合があります。この記事では、クラスパスベースのリソース読み込みのためのカスタム URL プロトコルとストリーム ハンドラーを導入して、この要件の解決策を検討します。
ソリューションの中心となるのは、次の URLStreamHandler です。指定された URL への接続。このハンドラーは、サポートされるプロトコルとして「シンプル」パッケージ名を使用して URL クラスに登録する必要があります。
package org.my.protocols.classpath; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; public class Handler extends URLStreamHandler { private final ClassLoader classLoader; public Handler() { this.classLoader = getClass().getClassLoader(); } @Override protected URLConnection openConnection(URL u) /*throws IOException*/ { final URL resourceUrl = classLoader.getResource(u.getPath()); return resourceUrl.openConnection(); } }
カスタム プロトコルを使用してリソースをロードするには、次の構文:
new URL("classpath:org/my/package/resource.extension").openConnection();
クラスパスに対する相対パスを指定することで、リソースを特定の指定をせずにロードできるようになります。
クラスパスからロードされたリソースを適切に処理するには、起動構成と JVM レベルのハンドラー登録に関する問題を解決する必要がある場合があります。
自動ハンドラー登録の代わりに、URL 中にハンドラーを手動で指定することができます。作成:
new URL( null, "classpath:some/package/resource.extension", new org.my.protocols.classpath.Handler(ClassLoader.getSystemClassLoader()) );
アプリケーション全体のクラスパス リソースの読み込みでは、URLStreamHandlerFactory を JVM に登録することをお勧めします。これにより、カスタム ハンドラーをすべての URL で使用できるようになります。
package my.org.url; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.util.HashMap; import java.util.Map; class ConfigurableStreamHandlerFactory implements URLStreamHandlerFactory { private final Map<String, URLStreamHandler> protocolHandlers; public ConfigurableStreamHandlerFactory(String protocol, URLStreamHandler urlHandler) { protocolHandlers = new HashMap<>(); addHandler(protocol, urlHandler); } public void addHandler(String protocol, URLStreamHandler urlHandler) { protocolHandlers.put(protocol, urlHandler); } public URLStreamHandler createURLStreamHandler(String protocol) { return protocolHandlers.get(protocol); } }
ファクトリを登録するには、URL.setURLStreamHandlerFactory() を呼び出し、構成されたファクトリを渡します。
カスタム URLStreamHandler およびストリーム ハンドラー ファクトリを作成することにより、Java のリソース読み込み機能を拡張して、アプリケーション上にあるリソースを含めることができます。クラスパス。これにより、柔軟性が向上し、さまざまなソースからリソースをロードするプロセスが簡素化されます。
以上がJava の URL サポートをカスタマイズしてクラスパスからリソースを直接ロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。