2014-03-05 165 views
1

所以下面是我的項目結構: 一個jar文件(名爲patch.jar)和一個資源文件夾;jar文件裏面的一個類讀取jar外的文件

所以在jar文件中有一個類(名爲patch.class);

在資源文件夾中有一個子文件夾(名爲腳本),並在子文件夾中有一個文件(名爲patch.file),我希望我的代碼可以讀取。

奇怪的是當我設置文件相對路徑,代碼無法讀取,但是如果我只是設置文件名沒有路徑,它的工作原理。

File a = new File("./resource/scripts/patch.file"); //not work 

File a = new File("./patch.file"); //works 

我真的很困惑,設置相對路徑應該這樣做嗎?

+0

請記住,一個相對路徑是相對於程序的「當前目錄」,可*(取決於程序是如何調用)是*什麼。你不能認爲它是你程序的根目錄,所以這樣硬編碼的相對路徑是一個壞主意。 – Wyzard

+0

@Wyzard謝謝,非常有幫助 – aken848

回答

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

0

File("...")中的相對路徑是相對於進程的工作目錄。如果File("some/path/file.txt")有效(或沒有),那是因爲文件系統中存在(或不存在)與運行Java進程的目錄相關的文件some/path/file.txt。如果您在命令行上運行,則此路徑與您所在的目錄有關。

您無法使用File("...")引用jar中的文件。要做到這一點,你需要這樣的事情:

InputStream is = this.getClass().getResourceAsStream("some/path/file.txt");