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


小唯快跑啊
浏览 416回答 2
2回答

慕妹3146593

您在问题中提出的比较清楚地解释了问题的性质。考虑这个代码:        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.

蓝山帝景

替换My.class.getResource(".")为My.class.getResource(".").getPath()。file:/Users/x/java_local/target/classes/../../src/my.json字面上检查为带有file:前缀的文件路径,因此在系统中找不到。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java