2

我正在尝试使用以下方式访问类路径上的资源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 访问文件。

4

1 回答 1

0

If you need to access files inside a jar, I recommend opening and reading the jar file with JarFile and JarFile.entries().

For example:

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

Note that URLDecoder.decode() decodes something such as %20 (— to a whitespace) after calling getFile()…</p>

于 2012-07-31T14:12:25.650 回答