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

标签 java string file directory relative-path

我使用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代码构造的相对路径是无效的。如果我在代码中使用绝对路径,那么它就可以工作。

我用的是苹果电脑。有关此问题如何发生以及如何解决的任何解释吗?

最佳答案

您在问题中提出的比较清楚地解释了问题的本质。考虑这段代码:

        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 .

关于java使用 "../../"构建的相对路径无法识别,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53094928/

相关文章:

java - 重命名查询字符串参数(如果存在)

Java错误api级别的方法

python - Pandas : Replace string column values

java - 什么会导致这种 Java 行为?

java - 由从未引用的对象创建的垃圾

java - 同步方法中是否有多个线程?

python - 消除多余的逗号

javascript - 字符串到数组或元素的数组

c# - 写入日志文件

php - 从 MySQL 读取更快还是从文件读取更快?