为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小唯快跑啊 2021-12-22 16:46:24
我正在使用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 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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

        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.


查看完整回答
反对 回复 2021-12-22
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 415 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号