【问题标题】:Accessing resources on classpath using parent folder sign (../)使用父文件夹符号 (../) 访问类路径上的资源
【发布时间】:2012-07-29 06:46:45
【问题描述】:

我正在尝试使用 getResourceAsStream() 访问类路径上的资源:

InputStream is = getClass().getResourceAsStream(path);

如果路径是这样的:/net/original/xsdtestxml.xml,那么我没有问题。 但是,在某些情况下,我必须使用“转到父级”符号../ 来访问某些文件。我正在根据某些参数手动构建路径。

最终结果是这样的:

/net/original/../original/xsdtestxml.xml

这在 Eclipse 中运行良好。当我在 Eclipse 之外运行它时它工作正常(从包含 .class 的程序目标文件夹中的命令行)。但是,一旦我将它们打包到 jar 文件中,它就会抛出 NullPointerException

getResourceAsStream() 导出到 jar 后是否有可能支持这种格式?如果没有,是否有 Java/ Utility 类可以在没有 ../ 符号的情况下获取文件路径?比如将/net/original/../original/xsdtestxml.xml转换成/net/original/xsdtestxml.xml格式?

一种可能的解决方案:

java.net 包中有一个URI 类可以满足我的需要。您只需使用构造函数创建 URI 对象或使用静态 create(String) 方法。然后调用normalize()方法,可以使用toString()getPath()方法获取字符串路径。

这是对我有用的代码示例:

String finalPath = URI.create(inputPath).normalize().getPath();

inputPath 是可以包含 ../ 文字的路径。 这完美地将/net/original/../original/xsdtestxml.xml 转换为/net/original/xsdtestxml.xml,这正是我从类路径上的jar 访问文件所需要的。

【问题讨论】:

    标签: java resources jar classpath


    【解决方案1】:

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

    例如:

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

    请注意,URLDecoder.decode() 在调用 getFile() 后会解码诸如 %20(— 到空格)之类的内容...

    【讨论】:

    • 我需要访问已经在类路径中的 jar 中存储的文件。您的解决方案展示了如何访问任何其他 jarfile(不一定在类路径上)上的文件,例如 zip。稍后这可能会派上用场,但我需要访问类路径上使用父目录文字 ../ 的 jar 文件的方法,例如 /net/original/../original/xsdtestxml.xml。
    • 我刚刚尝试了简单的java.io.File:我在/media/data/a.png 有一个文件,在/media/data/tmp 有一个文件夹。然后这个文件new File("/media/data/tmp/../a.png") 指向正确的a.png。因为所有其他方法(例如 length()isFile()...)都返回了正确的值。对你有帮助吗?
    • 感谢您的快速回复。 java.io.File 访问计算机文件系统上的文件。就我而言:我的文件位于 jar 文件中,并且该 jar 文件位于应用程序的类路径中(在运行 java 时使用 -cp 参数添加)。我尝试了从路径中删除 ../ 文字的方法,我找到了一种解决方案。我没有足够的声誉,所以我编辑了我最初的问题。这对我来说很好。
    • 我认为从类路径获得的路径指向系统上的真实文件。如果您有当前工作文件夹或父符号 (..) 工作的根文件夹,则可以将该路径与从类路径获得的路径组合。抱歉,我不确定这是对还是错……哦,恭喜,我刚刚看到了您的解决方案 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多