gpt4 book ai didi

javafx-2 - ClassName.class.getResourceAsStream() 不使用 Java 7 U 7 中的相对路径加载

转载 作者:行者123 更新时间:2023-12-01 22:57:08 25 4
gpt4 key购买 nike

问题陈述:如果相对路径,ClassName.class.getResourceAsStream() 不会加载/查找资源。如果路径是绝对路径,则可以正常工作。

我最近从使用 JavaFx 2.1 的 Java 6 升级到使用 JavaFX 2.2 的 Java SE 7 u 7。它在早期版本的 JAvaFX 2.0/Java FX 2.1 中运行良好。使用的IDE是NetBean IDE 7.2。

我遇到了一个我觉得很奇怪的问题。我使用 IDE 创建了一个 JAVA FX 项目并尝试加载属性文件。当指定绝对路径时,它工作正常。但是当我更改为相对路径时,它会异常失败。

ClassName.class.getResourceAsStream("../resources/newproperties.properties");//不起作用。

ClassName.class.getResourceAsStream("/resources/newproperties.properties");//使用绝对路径。

然后,我使用 JAva 7u7 在 Netbeans 7.2 IDE 中创建了另一个简单 Java 项目,并尝试使用 ClassName.class.getResourceAsStream("../newproperties.properties"); 加载属性文件。它适用于相对路径和绝对路径。基本上,如果它是 JAVAFX 2.2 项目,它不会加载。如果它是一个简单的 java 项目,那么相同的代码可以工作,我觉得这很奇怪。

注意:上面的代码在带有 Javafx 2.1 的 Java 6 上运行良好。

我们将不胜感激。

最佳答案

如果您的应用程序被打包为 jar(JavaFX 应用程序通常是这样),那么在获取资源操作的底层实现中使用的 jar 协议(protocol)将不会解析父 .. 说明符相对路径。

如果您的应用程序未打包,只是文件系统中类和其他文件的集合,则 .. 说明符将解析,因为资源查找将使用文件协议(protocol)而不是一个 jar 协议(protocol)。

演示上述要点的示例:

package classpathtest;

public class ClassPathTest {
public static void main(String[] args) {
System.out.println(ClassPathTest.class.getResourceAsStream("../roundbutton.css"));
}
}

样本的使用。

C:\dev\javafx\ClassPathTest\build\classes>echo any text > roundbutton.css

C:\dev\javafx\ClassPathTest\build\classes>echo Main-Class: classpathtest.ClassPathTest > manifest.txt

C:\dev\javafx\ClassPathTest\build\classes>jar cvfm ClassPathTest.jar manifest.txt roundbutton.css classpathtest
added manifest
adding: roundbutton.css(in = 521) (out= 257)(deflated 50%)
adding: classpathtest/(in = 0) (out= 0)(stored 0%)
adding: classpathtest/ClassPathTest.class(in = 680) (out= 399)(deflated 41%)

C:\dev\javafx\ClassPathTest\build\classes>java -jar ClassPathTest.jar
null

C:\dev\javafx\ClassPathTest\build\classes>java classpathtest.ClassPathTest
java.io.BufferedInputStream@927e4be

C:\dev\javafx\ClassPathTest\build\classes>java -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b54)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b21, mixed mode)

C:\dev\javafx\ClassPathTest\build\classes>dir /s
Directory of C:\dev\javafx\ClassPathTest\build\classes

09/12/2012 02:31 PM <DIR> classpathtest
09/12/2012 02:37 PM 1,414 ClassPathTest.jar
09/12/2012 02:36 PM 42 manifest.txt
09/12/2012 02:31 PM 521 roundbutton.css

Directory of C:\dev\javafx\ClassPathTest\build\classes\classpathtest

09/12/2012 02:31 PM 680 ClassPathTest.class

如果 java -jar ClassPathTest.jar 在较早的 jdk 版本上没有为您返回 null,但在 jdk7u7+ 上确实为您返回 null,那么您发现了一个 jdk 错误。除了我安装的版本之外,我没有测试过其他 jdk 版本,但我认为存在与此相关的 jdk 错误的可能性很低。

关于javafx-2 - ClassName.class.getResourceAsStream() 不使用 Java 7 U 7 中的相对路径加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12394100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com