當有人打開我的 jar 時,我正在打開一個檔案選擇器 gui,以便他們可以選擇存盤 jar 檔案(如組態檔等)的位置。這應該只發生在他們第一次打開罐子時。但是,這種方法的一個問題是我無法知道這是否是他們第一次打開罐子,因為我需要將選定的路徑保存在某處。對此的最佳解決方案聽起來像是將所選路徑保存在資源檔案夾中的檔案中,這是我遇到的問題。僅在程式實際運行時才需要讀取和寫入此資源檔案。這些讀寫操作需要適用于打包的 jar 檔案(我使用 maven)和 IDE。
我可以在 IDE 中讀取資源檔案,然后通過執行此操作將該檔案保存到檔案選擇器中指定的指定位置。但是,盡管從其他執行緒嘗試了多種其他方法,但我無法從 jar 中執行相同的操作。
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("config.yml");
try {
if(is != null) {
Files.copy(is, testFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
因此,為了澄清我的專案何時加載,我需要傾聽用戶為我的配置等檔案選擇有效路徑。然后我想將我的配置寫入我可以從我的 IDE 執行的路徑,如上所示,但是當我將專案編譯為 jar 檔案時我無法弄清楚這一點,因為我總是在我的 cmd 中收到一個找不到檔案的錯誤。但是,這篇文章的主要目的是讓我可以弄清楚如何將選定的路徑保存到我的資源檔案夾到一個檔案中(它可以是 json、yml 或任何你喜歡的)。在上面的代碼中,我能夠讀取一個檔案,但我不知道如何從中獲取檔案路徑,因為那時讀取和寫入它是微不足道的。另外請記住,我需要能夠從我的 IDE 和已編譯的 jar 讀取和寫入資源檔案夾。
以下代碼顯示了我嘗試從已編譯的 jar 中讀取資源。當我在 name.startWith(path) 上方添加列印陳述句時,我生成了大量參考 config.yml 的類串列,但我不確定我需要哪一個。我認為它必須是與我的專案相關的路徑之一,或者可能是 META-INF 或 META-INF/MANIFEST.MF 路徑。無論哪種方式,我如何能夠復制檔案或復制檔案的內容?
final String path = "resources/config.yml";
final File jarFile = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
if(jarFile.isFile()) { // Run with JAR file
try {
final JarFile jar = new JarFile(jarFile);
final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
while(entries.hasMoreElements()) {
final String name = entries.nextElement().getName();
if (name.startsWith(path)) { //filter according to the path
System.out.println(name);
}
}
jar.close();
} catch (IOException exception) {
exception.printStackTrace();
}
}
另外,如果您想知道我從以下帖子中獲得了上面的代碼,而我在上面粘貼的第一塊代碼實際上是在 else 陳述句中,因為該帖子中的 IDE 代碼也不起作用。 如何從我的 jar 檔案中訪問資源檔案夾中的檔案夾?
uj5u.com熱心網友回復:
您不能寫入 JAR 檔案中的檔案,因為它們實際上不是檔案,它們是 ZIP 條目。
為 Java 應用程式存盤配置的最簡單方法是使用Preferences:
Preferences prefs = Preferences.userNodeForPackage(MyApp.class);
現在您所要做的就是使用任何 get 方法來讀取,并使用 put 方法來寫入。
uj5u.com熱心網友回復:
絕對不需要將檔案寫入 jar 內的資源檔案夾。您所需要的只是一個智能類加載器結構。要么有一個允許更改 jars 的類加載器(實作起來有多難?),或者你只是在列出所有涉及的 jars 之前設定一個包含空目錄的類路徑。
只要您想更改資源,只需將檔案存盤在該目錄中即可。下次加載資源時,將在類路徑上搜索它并回傳第一個匹配項 - 在這種情況下,您更改的檔案。
現在,您的應用程式可能需要使用修改后的類路徑啟動,除此之外,它還需要知道首先放置了哪個目錄。您仍然可以在啟動器應用程式中設定該類加載器結構,然后將控制權轉移到通過新定義的類加載器加載的真實應用程式。
uj5u.com熱心網友回復:
您還可以在應用程式啟動時檢查是否存在諸如此類的目錄${user.home}/${application_name}/data
。
如果沒有,請通過將預定義的 zip 提取到此位置來創建它。然后只需運行您的應用程式,它將加載/寫入此目錄中的所有資料。
無需讀取/寫入類路徑。無需包含 3rd 方 API。并且修改這個初始資料集只是意味著分發一個新的 zip 以從中提取。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/506665.html
上一篇:沒有密碼的wordpress登錄
下一篇:影像的PythonPost請求