在Java中,您可以使用相同的API加载所有类型的资源,但是使用不同的URL协议:
file:///tmp.txt
http://127.0.0.1:8080/a.properties
jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class
这很好地将资源的实际加载从需要资源的应用程序中分离出来,而且由于URL只是一个字符串,因此资源加载也非常容易配置。
是否有使用当前类加载器加载资源的协议?这与Jar协议类似,不同之处在于我不需要知道资源来自哪个jar文件或类文件夹。
当然,我可以使用Class.getResourceAsStream("a.xml")
来做到这一点,但这需要我使用不同的API,因此需要对现有代码进行更改。我希望能够在所有我已经可以为资源指定URL的地方使用它,只需更新一个属性文件。
发布于 2011-01-05 00:50:18
URL url = getClass().getClassLoader().getResource("someresource.xxx");
这应该就行了。
发布于 2012-08-14 22:40:52
我认为这是值得自己回答的--如果你使用Spring,你已经有了这个
Resource firstResource =
context.getResource("http://www.google.fi/");
Resource anotherResource =
context.getResource("classpath:some/resource/path/myTemplate.txt");
就像spring documentation中解释的,并在skaffman的评论中指出的。
发布于 2011-07-25 00:44:41
您还可以在启动期间以编程方式设置该属性:
final String key = "java.protocol.handler.pkgs";
String newValue = "org.my.protocols";
if (System.getProperty(key) != null) {
final String previousValue = System.getProperty(key);
newValue += "|" + previousValue;
}
System.setProperty(key, newValue);
使用这个类:
package org.my.protocols.classpath;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
public class Handler extends URLStreamHandler {
@Override
protected URLConnection openConnection(final URL u) throws IOException {
final URL resourceUrl = ClassLoader.getSystemClassLoader().getResource(u.getPath());
return resourceUrl.openConnection();
}
}
因此,您可以使用侵入性最小的方式来完成此操作。:) java.net.URL将始终使用系统属性中的当前值。
https://stackoverflow.com/questions/861500
复制相似问题