我一直沒有用java處理很長時間,所以我不知道還有什麼要注意的。我希望有人能指出我正確的方向。獲取子包類的資源
目標: 我想使用查找表,作爲文本文件存儲。但是我不想使用絕對路徑,因爲最終我想打包一個版本,並且能夠從任何位置調用它(文本文件將包含在打包版本中)。
當前設置: 我把文本文件,一個名爲「資源」文件夾中(因爲從閱讀Java教程,給我的感覺,這就是我應該把它保持一個更好的結構化項目)。
在根包文件夾中我有一個類(MainClass.java)調用另一個類(LookUpClass.java)在一個子包中。 該文件夾的設置是如下:
- SRC
- 的java
- main.package.com
- 子包
- LookUpClass.java
- PlotterClass.java
- MainClass.java
- 子包
- main.package.com
- 資源
- LookUpTables
- LookUpTable1.txt
- LookUpTable2.txt
- LookUpTables
- 的java
我在LookUpClass.java
中寫了一個方法,它從資源中的查找表中檢索某一行。要檢索文件,並讀出一定行,我用
// Gets respective line from LUT
private static String getLineFromLUT(int line) {
URL url = LookUpClass.class.getClass().getResource("/LookUpTables/LookUpTable1.txt");
File file = new File(url.toURI());
BufferedReader br = new BufferedReader(new FileReader(file));
for (int i = 0; i < line; ++i)
br.readLine();
return br.readLine;
}
在我的項目結構中的「Java」的文件夾被標記爲「源」,而「資源」被標記爲,那麼,「資源」。
我的測試設置非常簡單:
public static void main(String[] args) throws URISyntaxException, IOException {
String c = LookUpClass.getLineFromLUT(5);
System.out.println("Color of line 5: " + c);
}
輸出:
Color of line 5: 0 0 38
(這是正確的。)
我加入了完全相同的線路PlotterClass.java
和它的工作原理沒關係。
問題:
現在,如果我嘗試同樣在MainClass.java
我得到一個錯誤與url
被空。似乎無法找到資源/資源文件夾。
我通過各種帖子上SO已經閱讀並嘗試了幾種提出的解決方案,而這一切至今未能:
- 如果使用
LookUpClass.class.getClassLoader().getResource("/LookUpTables/LookUpTable1.txt")
都召喚從MainClass.java
和LookUpClass.java
失敗(url
爲空)。 - 我嘗試使用以下路徑(全部未在任一類的工作): 「LookUpTables/LookUpTable1.txt」(除去起始 「/」) 「/subpackage/LookUpTables/LookUpTable1.txt」 」 ../子包/ LookUpTables/LookUpTable1.txt「
- 由於使用Idea IntelliJ,我選中了」設置>構建,執行,部署> Compiter>資源模式「,並在模式中添加了」* .txt「。沒有改變。
- 如果添加
Class c = LookUpClass.class.getClass();
,則在調試模式下,c是「class.java.lang.Class」。我期待像「main.package.com.subpackage.LookUpClass」。 - 在某些時候,我嘗試使用
getResourceAsStream()
,但我不明白如何得到我的(例如)第5行,所以我放棄了它。如果能解決我的問題,我願意在此閱讀。
我不知道如何解決這個問題。我意識到在這一點上,我只是在嘗試一些事情,甚至不理解爲什麼它可以或不可以工作。 對我來說,它似乎是LookUpClass.java
從MainClass.java
不同的位置運行。但「資源」 - 文件夾和各自的文本文件位置永遠不會改變。如何在一個案件中找到該文件,但在另一個案件中找不到該文件?
還有三個問題:您是否在使用IDE(如Eclipse)?你是否使用任何構建工具(如Maven)?您的文本文件意味着是由用戶更新還是他們是發行版的一部分? – Seelenvirtuose 2015-04-02 13:22:53
您可以嘗試確保您正在使用的類對象是否實際加載,例如,通過'try {0}來嘗試加載該類對象。 \t \t \t \t}趕上(最終ClassNotFoundException的前){ \t \t \t \t}' – muued 2015-04-02 13:38:39
@Seelenvirtuose是這兩個:我使用的IntelliJ和項目確實是使用Maven構建。文本文件意味着是靜態的並且是分發的一部分。它們包含熱圖的RGB代碼。 – fukiburi 2015-04-02 13:47:19