2012-04-16 94 views
4

找到相對於Java應用程序「安裝」的文件夾的路徑的最佳方式是什麼?Java FileOutputStream:相對於程序文件夾的路徑?

我有一個靜態方法的類:public static void saveToFile(String fileName)

當我把它叫做絕對路徑,它的工作原理,但我真正想要的是在應用程序從運行到相對路徑和文件夾。

我還沒有部署我的應用程序,但現在我想找到一個相對於(Netbeans)項目根目錄和被調用數據中的文件夾的路徑:ProjectName \ data \ file.dat。我應該使用File課程還是將其製作成URI或其他?

請注意,我更喜歡它是獨立於系統的,並且在部署應用程序時仍然可以工作。最終(相對)路徑名將存儲在屬性文件中。

對不起,如果這個問題是重複的,任何幫助表示讚賞。

回答

3

什麼找到相對於java應用程序「安裝」的文件夾的路徑的最佳方法?

OS廠商一直說很長一段時間保存在應用程序目錄中的文件。取而代之的是將File置於user.homesub-directory。用戶主頁是應該可以建立可以讀取或寫入的文件對象的地方。這也是一個可以在整個運行過程中重現的地方,也是獨立於平臺的地方。

請注意,我更喜歡它是系統無關的,並且如果部署應用程序仍然可以工作。 ..這是一個簡單的Java Swing應用程序..

然後你應該看看的一個部署選項是Java Web Start。它不僅使最終用戶輕鬆安裝(單擊鏈接&確定提示),但它也提供PersistenceService來存儲少量數據。這是一個小的demo. of the PersistenceService

如果用例需要存儲大量數據,持久性服務將不適合數據本身,但可以將(絕對)路徑存儲到實際數據存儲的任何位置。這樣,您可能會有默認指向user.home的路徑,但是如果用戶選擇其他位置,請使用持久性服務存儲該位置。

一個應用程序。使用JWS啓動默認情況下具有安全沙箱。要寫入本地文件系統需要放鬆沙箱。這需要開發人員對應用程序的Jars進行數字簽名。 &請求all-permissions在啓動文件中,並且讓用戶在提示時接受簽名代碼。

另一方面。 Sun前段時間決定使用保護域來查找緩存Jars的位置是一種安全風險。因此,他們決定返回的信息總是指向服務器,對於兩個小程序& JWS應用程序。或者換句話說,即使應用程序,保護域也不會指向本地文件系統。被本地緩存。

+0

感謝您的時間和明確的答案。 – MarioDS 2012-04-16 19:44:31

0

查找當前工作目錄的相對路徑,如new File(".")

如果你想知道當前工作目錄的絕對路徑,你可以寫new File(".").getAbsolutePath()或File(「。」)。getAbsoluteFile()`。

我希望這能回答你的問題。如果我沒有正確理解你,我很抱歉。

+0

您的理解不正確。他希望程序路徑,而不是工作目錄。 – j13r 2012-04-16 18:23:40

+0

我嘗試了使用'「。」 + File.separator +「data」+ File.separator +「file.dat」'它不起作用... – MarioDS 2012-04-16 18:26:42

+0

好吧我試着用File來打印絕對路徑,它的**絕對正確**並且它沒有工作......它根據需要返回'C:\ blah \ projectName \ data \ file.dat' ... – MarioDS 2012-04-16 18:34:42

2

如果你作爲一個罐子部署,它可以得到的jar文件名和路徑當前代碼工作像這樣:

new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()); 

(從How to get the path of a running JAR file?

+0

如果我在netbeans中運行我的項目,這項工作是否會完成? – MarioDS 2012-04-16 18:34:06

+0

可能。試試看。 – j13r 2012-04-16 19:44:12

+0

非常有用。謝謝 – jmcg 2016-04-21 03:15:57

1

在這裏你去:

String path = System.getProperty("user.dir"); 
0

要得到一個文件的絕對路徑使用新的文件()getCanonicalFile()。

new FileOutputStream(new File(".\\target\\dataset.xml").getCanonicalFile())