jar文件中的类读取jar外部的文件

时间:2014-03-05 23:07:28

标签: java jar

以下是我的项目结构: 一个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 

我真的很困惑,设置相对路径应该这样做吗?

2 个答案:

答案 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");