我正在尝试使用getResourceAsStream()
访问类路径上的资源:
InputStream is = getClass().getResourceAsStream(path);
如果路径是这样的:/net/original/xsdtestxml.xml
,那么我没有问题。
但是,我必须使用“转到父级”符号../
来访问某些文件。我正在根据某些参数手动构建路径。
最终结果是这样的:
/net/original/../original/xsdtestxml.xml
这在Eclipse中运行良好。当我在Eclipse之外运行时(从包含.class的程序目标文件夹中的命令行),它工作正常。但是,只要我将它们打包在jar文件中,它就会抛出NullPointerException
。
导出到jar后,getResourceAsStream()
是否有可能支持这种格式?如果没有,是否有一个Java / Utility类可以获得没有../
符号的文件路径?例如,要将/net/original/../original/xsdtestxml.xml
转换为/net/original/xsdtestxml.xml
格式吗?
一种可能的解决方案:
在URI
包中找到了java.net
类,可以满足我的需要。您只需使用构造函数创建URI
对象或使用静态create(String)
方法。然后,您调用normalize()
方法,并使用toString()
或getPath()
方法获取字符串路径。
以下是适用于我的代码示例:
String finalPath = URI.create(inputPath).normalize().getPath();
inputPath
是可以包含../
文字的路径。
这完美地将/net/original/../original/xsdtestxml.xml
转换为/net/original/xsdtestxml.xml
,这正是我在类路径上从jar访问文件所需要的。
答案 0 :(得分:0)
如果您需要访问jar中的文件,我建议您使用JarFile和JarFile.entries()打开并阅读jar文件。
例如:
String s = getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
JarFile jf = new JarFile(java.net.URLDecoder.decode(s, "UTF-8"));
// ...
请注意URLDecoder.decode()
在调用%20
之后解码getFile()
( - 到空白)等内容...