以下是我的项目结构: 一个jar文件(名为patch.jar)和一个资源文件夹;
所以在jar文件中有一个类(名为patch.class);
在资源文件夹中有一个子文件夹(名为scripts),在子文件夹中有一个文件(名为patch.file),我想让我的代码读取。
奇怪的是,当我设置文件相对路径时,代码无法读取,但是如果我只是设置文件名而没有路径,则可以正常工作。
File a = new File("./resource/scripts/patch.file"); //not work
File a = new File("./patch.file"); //works
我真的很困惑,设置相对路径应该这样做吗?
答案 0 :(得分:1)
你有一个罐子的事实是无关紧要的。重要的是文件相对于当前目录的位置(执行pwd
时获得的位置)。如果您在目录/Home/aken
中,并执行命令
less ./resources/scripts/patch.file
它会尝试打开并显示文件/Home/aken/resources/scripts/patch.file
。
Java中的相对文件路径也是如此。如果您在目录/Home/aken
中,并执行
java -cp patch.jar patch
并且该类的代码使用
new File("./resource/scripts/patch.file");
然后java将尝试打开文件/Home/aken/resources/scripts/patch.file
。
如果你在/foo/bar
并执行命令
java -cp /Home/aken/patch.jar patch
然后java将搜索相对于当前目录的文件,即/foo/bar
。因此它将打开文件/foo/bar/resources/scripts/patch.file
。
答案 1 :(得分:0)
File("...")
中的相对路径与进程的工作目录相关。如果File("some/path/file.txt")
有效(或没有),那是因为文件系统中文件some/path/file.txt
相对于运行Java进程的目录存在(或不存在)。如果在命令行上运行,则此路径相对于您所在的目录。
您无法使用File("...")
引用jar中的文件。要做到这一点,你需要这样的东西:
InputStream is = this.getClass().getResourceAsStream("some/path/file.txt");