【问题标题】:File Write in resource folder in jar文件写入jar中的资源文件夹
【发布时间】:2026-02-18 12:45:02
【问题描述】:

我的 java swing 项目中有一个资源文件夹(文件),其中包含一个文本文件(users.txt),我正在读取数据并将数据写入该文本文件。 当我将它导出为 jar 文件时,从该文件中读取是可以的,但是写入文件是有问题的。 我正在以这种方式读取文件

InputStream in1 = getClass().getResourceAsStream("/files/users.txt"); 
BufferedReader reader1 = new BufferedReader(new InputStreamReader(in1));

在 jar 文件中可以正常阅读 和在代码下面写在同一个文件中(这是jar文件的问题)

    File file = new File("src/files/users.txt"); 
    FileWriter fw = new FileWriter(file,true);
    fw.write(data+"\n");
    fw.close();

请帮助我如何使用 jar 文件写入资源文件夹中的文件。 谢谢!

【问题讨论】:

  • 如果文件在 jar 中,则无法更新文件。
  • 资源应该被认为是只读的。换句话说,不支持写入资源(即使 not 打包在 JAR 文件中)。应用程序数据应存储在其他位置。
  • @Slaw 有没有其他方法可以在没有数据库的情况下跟踪 jar 文件中的数据(读/写)?实际上我正在写一些数据并稍后使用/检查。
  • 写入文件系统中的文件

标签: java file jar directory writer


【解决方案1】:

正如 cmets 所说,JAR 中的文件被认为是只读的。

您必须在某个用户或基于安装目录的位置(或用户选择的位置)创建文件。

如果您有预先配置的数据,您至少有 2 个选项:

  • 使用某种打包工具(也可以是 ZIP 文件)将文件与 JAR 文件一起发送。对于 ZIP 文件,如果您使用 Maven,请查看 Maven 程序集插件。
  • 从 JAR 中提取文件。

对于后一个用例,我编写了一些实用程序类:

public void extractResource(String resourcePathString, Path targetDirPath) throws IOException, URISyntaxException {  
    URI jarURI = JarFiles.getJarURI(SomeClassInTheJar.class);  
    try (FileSystem jarFS = JarFiles.newJarFileSystem(jarURI)) {  
        Path resourcePath = jarFS.getPath(resourcePathString);  

        CopyFileVisitor.copy(resourcePath, targetDirPath);  
    }  
}  

借助 CopyFileVisitor,您可以轻松地从 JAR 或 ZIP 文件中递归提取/添加目录,因为 CopyFileVisitor 使用 PathUtils,因此可以跨文件系统工作。

JarFiles.getJarURI 获取类的 JAR URI。

更多信息请看教程:https://www.softsmithy.org/softsmithy-lib/lib/2.1.1/docs/tutorial/nio-file/index.html#ExtractJarResourceSample

该库是开源的。您可以从 Maven Central 获取它:

        <dependency>
            <groupId>org.softsmithy.lib</groupId>
            <artifactId>softsmithy-lib-core</artifactId>
            <version>2.1.1</version>
        </dependency>

【讨论】: