java使用“ ../../”构造的相对路径无法识别,为什么?

时间:2018-11-01 03:39:57

标签: java string file directory relative

我正在使用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上。关于此问题如何发生以及如何解决的任何解释?

谢谢

2 个答案:

答案 0 :(得分:1)

My.class.getResource(".")替换为My.class.getResource(".").getPath()

file:/Users/x/java_local/target/classes/../../src/my.json实际上被检查为前缀为file:的文件路径,因此在系统中找不到。

答案 1 :(得分:1)

您在问题中进行的比较清楚地说明了问题的性质。考虑以下代码:

        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。看到开头的“文件:”吗?您具有有效的URL字符串表示形式,但是File(String)希望参数为纯路径。

可能想要

    File f = new File(new URI(s));

,但是请注意,如果您的类包装在Jar中,则此操作将失败,因为这样您的URI将具有jar:方案,并且File(URI)仅接受具有file:方案的URI

如果您想读取与您的班级相关联且相对于班级相对应的资源,那么我建议您使用Class.getResourceAsStream(relativePath)并使用结果InputStream