使用父文件夹符号(../)访问类路径上的资源

时间:2012-07-31 13:25:54

标签: java resources jar classpath

我正在尝试使用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访问文件所需要的。

1 个答案:

答案 0 :(得分:0)

如果您需要访问jar中的文件,我建议您使用JarFileJarFile.entries()打开并阅读jar文件。

例如:

String s = getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
JarFile jf = new JarFile(java.net.URLDecoder.decode(s, "UTF-8"));
// ...

请注意URLDecoder.decode()在调用%20之后解码getFile()( - 到空白)等内容...