【问题标题】:java constructed relative path using "../../" is not recognized, why?java使用“../../”构造的相对路径无法识别,为什么?
【发布时间】:2018-11-01 03:39:57
【问题描述】:

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

【问题讨论】:

    标签: java string file directory relative-path


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多