2012-07-15 22 views
0

我想從命令行運行MyRunnableJar.jar。它需要從file_[1-4].dat中讀取,做一些處理,然後寫入file_5.dat。上述所有數據文件都在文件系統中靠近MyRunnableJar.jar。例如:如何從可運行JAR內讀取/寫入外部數據資源?

  • super_directory/
    • MyRunnableJar.jar
    • data_resources/
      • file_1.dat
      • file_2.dat
      • file_3.dat
      • nested_data_directory/
        • file_4.dat
        • file_5.dat

MyRunnableJar.jar被Eclipse的Export功能創建的。)

我之所以想這樣做事是因爲應用程序的運行成本太高,無法運行在我的小筆記本上。相反,我想將它放在遠程服務器(包含所有必須訪問的大數據文件)並在那裏運行。

問題是,我想不出如何顯示那些數據文件所在的可運行JAR。如果需要,數據文件當然可以移動。但是,將它們保留在JAR中並不是一種選擇,因爲如果我想要更改一些應用程序代碼,則必須重新傳輸整個JAR,如果它包含數據文件,則該JAR會很大。此外,如果它實際上位於我的JAR中,我將無法寫入file_5.dat

我知道在Stack Exchange上有很多類似的問題,但在每種情況下,問題在某些重要方面略有不同。


編輯:

  • 請參閱接受的答案。
  • 另外請注意,安德烈的解決方案(在評論中解釋)也有效,因爲在我的情況下,JAR和數據文件將始終在文件系統中相對於彼此位於相同的位置。
+2

_爲什麼每個問題在一些重要的方面有所不同?顯示努力。 – 2012-07-15 22:58:20

+0

我不太確定,但我認爲如果您在java程序中使用相對路徑,它將從工作目錄開始。所以如果你說'新的文件(「data_resources/file_1.dat」)'它應該打開第一個文件。 – 2012-07-15 23:02:18

回答

1

你真正需要的是能夠做的就是找出你的.jar文件就是目錄不管什麼System.property("user.dir");返回或其中MyRunnableJar.jar從執行。您不希望假設您目前位於與MyRunnableJar.jar相同的目錄中,如果您不是,則您無法計算出相對於目錄,因爲您不知道您在哪裏相對.jar了。

下面的代碼片段會爲你做到這一點:

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

main類取代MyClass

然後,你可以用它來建立你想從中讀取數據的目錄路徑。這裏都是蛋糕。

+0

只是要清楚: 您的片段的返回值是與片段運行的類關聯的File對象,是正確的嗎? 在這種情況下,下一步是複製和操作該類文件的路徑,以便它實際上指向我想要打開的資源以進行讀取/寫入? PS:安德烈的簡單的'新的文件(「relative_path/file_name.fil」)'解決方案爲我工作。是否有任何理由更喜歡您提出的解決方案? – sheac 2012-07-17 01:17:54

+0

是的,我的解決方案將工作,不管'.jar'的位置在哪裏,也不管它從哪裏執行。如果你從一個非*所在的路徑執行'.jar'(即;當前的目錄是**而不是**和'.jar'的位置相同,那麼這個解決方案將不起作用。 – 2012-07-17 04:00:43