java 使用“../../”构建的相对路径无法识别,为什么?
java constructed relative path using "../../" is not recognized, why?
我正在使用 intellij 进行 java 开发,在我的 project/src 目录下,我有一个 "my.json" 文件,我的 java 程序是:
import java.io.File;
public class My {
public static void main(String [] args){
String s = My.class.getResource(".") + "../../src/my.json";
File f = new File(s);
System.out.println(s+" exists: "+f.exists());
}
}
它打印:
file:/Users/x/java_local/target/classes/../../src/my.json exists: false
但是如果我"ls"在命令行下:
ls /Users/x/java_local/target/classes/../../src/my.json
那我就可以看到了。
所以看来java代码构造的相对路径是无效的。如果我在代码中使用绝对路径,那么它就可以工作。
我在 mac。关于此问题如何发生以及如何解决的任何解释?
将 My.class.getResource(".")
替换为 My.class.getResource(".").getPath()
。
file:/Users/x/java_local/target/classes/../../src/my.json
被字面上检查为带有 file:
前缀的文件路径,因此在系统中找不到。
你在问题中给出的比较清楚地说明了问题的性质。考虑这段代码:
File f = new File(s);
System.out.println(s+" exists: "+f.exists());
和相应的输出:
file:/Users/x/java_local/target/classes/../../src/my.json exists: false
显然 s
,您试图用作文件名的字符串是 file:/Users/x/java_local/target/classes/../../src/my.json
。看到开头的 "file:" 了吗?您有 URL 的有效字符串表示形式,但 File(String)
期望参数是普通路径。
可能你想要
File f = new File(new URI(s));
,但请注意,如果您的 class 被打包在一个 Jar 中,这将失败,因为那样您的 URI 将具有 jar:
方案,而 File(URI)
仅接受具有file:
方案。
如果您想读取与您的 class 关联并相对于它定位的资源,那么我建议使用 Class.getResourceAsStream(relativePath)
并使用生成的 InputStream
.
我正在使用 intellij 进行 java 开发,在我的 project/src 目录下,我有一个 "my.json" 文件,我的 java 程序是:
import java.io.File;
public class My {
public static void main(String [] args){
String s = My.class.getResource(".") + "../../src/my.json";
File f = new File(s);
System.out.println(s+" exists: "+f.exists());
}
}
它打印:
file:/Users/x/java_local/target/classes/../../src/my.json exists: false
但是如果我"ls"在命令行下:
ls /Users/x/java_local/target/classes/../../src/my.json
那我就可以看到了。
所以看来java代码构造的相对路径是无效的。如果我在代码中使用绝对路径,那么它就可以工作。
我在 mac。关于此问题如何发生以及如何解决的任何解释?
将 My.class.getResource(".")
替换为 My.class.getResource(".").getPath()
。
file:/Users/x/java_local/target/classes/../../src/my.json
被字面上检查为带有 file:
前缀的文件路径,因此在系统中找不到。
你在问题中给出的比较清楚地说明了问题的性质。考虑这段代码:
File f = new File(s); System.out.println(s+" exists: "+f.exists());
和相应的输出:
file:/Users/x/java_local/target/classes/../../src/my.json exists: false
显然 s
,您试图用作文件名的字符串是 file:/Users/x/java_local/target/classes/../../src/my.json
。看到开头的 "file:" 了吗?您有 URL 的有效字符串表示形式,但 File(String)
期望参数是普通路径。
可能你想要
File f = new File(new URI(s));
,但请注意,如果您的 class 被打包在一个 Jar 中,这将失败,因为那样您的 URI 将具有 jar:
方案,而 File(URI)
仅接受具有file:
方案。
如果您想读取与您的 class 关联并相对于它定位的资源,那么我建议使用 Class.getResourceAsStream(relativePath)
并使用生成的 InputStream
.