有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用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上。有没有关于这个问题是如何发生的以及我如何解决它的解释


共 (1) 个答案

  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