在 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中文网其他相关文章!