在 Java 中,可以使用類似的 API 但使用不同的 URL 協定來載入各種資源。這樣可以將資源載入過程與應用程式解耦,並簡化資源配置。
是否可以利用目前類別載入器的協定來取得資源,類似於 Jar 協議,但不指定原始檔案或資料夾?
這可以透過實作自訂 URLStreamHandler 和將其註冊到 JVM。
import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.util.HashMap; import java.util.Map; public class ClasspathHandler extends URLStreamHandler { private final ClassLoader classLoader; public ClasspathHandler(ClassLoader classLoader) { this.classLoader = classLoader; } @Override protected URLConnection openConnection(URL u) throws IOException { // Locate the resource using the classloader URL resourceUrl = classLoader.getResource(u.getPath()); // Open the connection to the resource return resourceUrl.openConnection(); } }
用法: 自訂處理程序可以與從類別路徑載入資源的URL:
new URL("classpath:org/my/package/resource.extension").openConnection();
要使處理程序全局可訪問,請使用URLStreamHandlerFactory 將其註冊到JVM:
import java.net.URL; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.util.HashMap; import java.util.Map; public class ClasspathHandlerFactory implements URLStreamHandlerFactory { private final Map<String, URLStreamHandler> protocolHandlers; public ClasspathHandlerFactory() { protocolHandlers = new HashMap<String, URLStreamHandler>(); addHandler("classpath", new ClasspathHandler(ClassLoader.getSystemClassLoader())); } public void addHandler(String protocol, URLStreamHandler handler) { protocolHandlers.put(protocol, handler); } public URLStreamHandler createURLStreamHandler(String protocol) { return protocolHandlers.get(protocol); } }
使用配置好的工廠呼叫URL.setURLStreamHandlerFactory() 進行註冊它。 授權提供的實作已發佈到公共領域。作者鼓勵分享和公開修改。 附加說明雖然這種方法提供了靈活性,但考慮潛在的問題也很重要,例如多個 JVM Handler Factory 註冊的可能性和Tomcat 使用 JNDI 處理程序。因此,建議在所需的環境中進行測試。
以上是如何使用自訂 URL 協定從 Java 類別路徑載入資源?的詳細內容。更多資訊請關注PHP中文網其他相關文章!