【问题标题】:JAVA getResourceAsStream() real path string interpretation of a fileJAVA getResourceAsStream() 文件的真实路径字符串解释
【发布时间】:2017-08-20 14:27:57
【问题描述】:

我正在使用 NetBeans 8.0.2(我知道已经有 v8.2,但它对我来说有很多错误,所以我回到 v8.0.2)并且我需要一个指向我的 .obj 文件的字符串路径参数属性如下:

api.parameter("filename", "obj/someFile.obj");

上面的示例在我的应用程序的先前版本中工作,我将 .obj 文件放在与 .jar 文件相同的目录中名为“obj”的文件夹中,但现在我试图将其包含在带有代码的 JAR 本身:

api.parameter("filename", MyClass.class.getResourceAsStream("/someFile.obj").toString());

...它不再起作用,因为路径字符串解释不是文件的路径,它看起来更像这样:

java.io.BufferedInputStream@215d7ea7

...当然,我的代码需要像普通路径字符串这样的东西,我会以这种伪代码的方式说:

api.parameter("filename", "<this.jar>/someFile.obj");

所以在对 StackOverflow 进行了一番摆弄之后,我发现了一些我认为实际上可以让我直接将该路径作为字符串放置的代码:

URL jar = MyClass.class.getProtectionDomain().getCodeSource().getLocation();
api.parameter("filename", jar + "/someFile.obj");

但令人惊讶的是,尽管我多次检查该文件是否真的存在于我构建的 jar 文件中(是​​的,它在根目录中),但它仍然给我这个错误:

java.io.FileNotFoundException: file:\Z:\_JAVA_\MyProject_0_018\dist\bin\myjar.jar\someFile.obj <The filename, directory name, or volume label syntax is incorrect>

而且我 100% 确定文件的名称是正确的,而且它在我的 jar 文件的根目录中的位置也是正确的。

还是它真的认为myjar.jar 是一个目录?

我正在拼命寻找这个“路径字符串”混乱的解决方案。

【问题讨论】:

    标签: java path stream getresource


    【解决方案1】:

    您的保护域的代码源位置返回的结果可能不是您所期望的。

    你应该直接使用getResource(name),像这样:

    URL locator = MyClass.class.getResource("someFile.obj");
    api.parameter("filename", locator.toString());
    

    【讨论】:

    • 不幸的是,这不起作用——它一直给我NullPointerException——这实际上是我改用getResourceAsStream()的确切原因......
    • 无论如何,我已经在不久前在目标方法中的代码中进一步解决了这个问题,getResourceAsStream() 工作得很好,没有任何问题...... ;-)
    • @theoneiam 你能分享一下你是如何解决这个问题的吗?我也遇到了类似的
    • @AmolBais,您不应该引用内部 jarfile 资源,就好像 jarfile 是一个目录并且这些资源是其中的文件一样。您需要向 jar 的类加载器询问资源,如果您的类加载器找不到它,那么这意味着您要么没有提供正确的资源路径,要么没有打包这样的资源。进一步的说明可以参考相关方法的javadoc。
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2012-09-16
    • 2014-09-15
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多