无法识别使用“./../”构造的字符串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 楼答案
你在问题中提出的比较清楚地解释了问题的性质。考虑这个代码:
以及相应的输出:
显然
s
,您试图用作文件名的字符串是file:/Users/x/java_local/target/classes/../../src/my.json
。看到开头的“文件”了吗?您有URL的有效字符串表示形式,但File(String)
希望参数是普通路径也许你想要
,但请注意,如果您的类打包在Jar中,这将失败,因为这样您的URI将具有
jar:
方案,并且File(URI)
只接受具有file:
方案的URI如果你想阅读一个与你的类相关的资源,并且是相对于它的,那么我建议你使用
Class.getResourceAsStream(relativePath)
并使用得到的InputStream