簡體   English   中英

Java 讀寫資源文件夾

[英]Java read and write to the resource folder

當有人打開我的 jar 時,我正在打開一個文件選擇器 gui,這樣他們就可以選擇他們想要存儲 jar 文件(如配置文件等)的位置。 這應該只在他們第一次打開 jar 時發生。 但是,這種方法的一個問題是我無法知道這是否是他們第一次打開 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();
        }

因此,為了澄清我的項目何時加載,我需要傾聽用戶 select 文件的有效路徑,例如我的配置。 然后我想將我的配置寫入我可以從 IDE 執行的路徑,如上所示,但是當我將項目編譯成 jar 文件時我無法弄清楚這一點,因為我總是在我的 ZDFFA20A7FA1A5FCDACC4C40Z 文件中收到一個文件未找到錯誤但是,這篇文章的主要目的是讓我可以弄清楚如何將選定的路徑保存到我的資源文件夾到一個文件中(它可以是 json、yml 或任何你喜歡的)。 在上面的代碼中,我能夠讀取一個文件,但我不知道如何從中獲取文件路徑 go ,因為那時讀取和寫入它是微不足道的。 另外請記住,我需要能夠從我的 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 文件中訪問資源文件夾中的文件夾?

您不能寫入 JAR 文件中的文件,因為它們實際上不是文件,它們是 ZIP 條目。

為 Java 應用程序存儲配置的最簡單方法是使用Preferences

Preferences prefs = Preferences.userNodeForPackage(MyApp.class);

現在您所要做的就是使用任何 get 方法來讀取,並使用 put 方法來寫入。

絕對不需要將文件寫入 jar 內的資源文件夾。 您所需要的只是一個智能類加載器結構。 要么有一個允許更改 jars 的類加載器(實現起來有多難?),或者您只需在列出所有涉及的 jars 之前設置一個包含空目錄的類路徑。

只要您想更改資源,只需將文件存儲在該目錄中即可。 下次加載資源時,將在類路徑上搜索它並返回第一個匹配項 - 在這種情況下,您更改的文件。

現在,您的應用程序可能需要使用修改后的類路徑啟動,除此之外,它還需要知道首先放置了哪個目錄。 您仍然可以在啟動器應用程序中設置該類加載器結構,然后將控制權轉移到通過新定義的類加載器加載的真實應用程序。

您還可以在應用程序啟動時檢查${user.home}/${application_name}/data等目錄是否存在。

如果沒有,請通過將預定義的 zip 提取到此位置來創建它。 然后只需運行您的應用程序,它將加載/寫入此目錄中的所有數據。

無需讀取/寫入類路徑。 無需包含 3rd 方 API。 修改這個初始數據集只是意味着分發一個新的 zip 以從中提取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM