如何在不使用 src/main/resources 的情况下使用资源文件夹中的 GSON 编写 JSON 文件?

How do I write a JSON file using GSON in the resources folder without using src/main/resources?

我正在尝试在不使用 src/main/resources 的情况下在资源文件夹中使用 GSON 编写一个 JSON 文件:

package repository;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import org.tinylog.Logger;

import java.io.*;
import java.util.List;

public class GsonRepository<T> extends Repository<T> {

    private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();

    public GsonRepository(Class<T> elementType) {
        super(elementType);
    }

    public void saveToFile(String resourceName) throws IOException {
        try (var writer = new FileWriter(this.getClass().getResource(resourceName).getPath())) {
            GSON.toJson(elements, writer);
        }
    }
}

这似乎不起作用。我做错了什么?

I'm trying to write a JSON file with GSON in the resources folder

好吧,那是你的问题。因为那是完全不可能的。

'resources'文件夹是开发者电脑上存在的东西。因此,你不能写一个不存在的东西。

资源文件夹专用于 read-only 资源。考虑表格数据文件(例如,国家名称列表和 phone 数字前缀)、图标文件、HTML 模板,诸如此类的业务。

您可以使用GsonRepository.class.getResource和(.getResourceAsStream)加载这些文件 - 任何将它们视为文件的尝试都将在开发期间起作用,然后失败当你部署时。

如果您有配置文件或保存文件,这些文件不会进入资源文件夹,根本不会加载 .getResource。您应该将它们放在用户的主目录中 (System.getProperty("user.home")):安装 java 应用程序的目录不会被应用程序本身写入(或者如果是,则您的配置非常糟糕 OS 出于安全目的。当然,Windows 配置不当。不过,开始将 user-editable 数据文件粘贴到应用程序的安装目录中并不是一个好主意! )

new FileWriter(this.getClass().getResource

这没有意义。在java中,File表示文件。资源 不是文件 - 例如,jar 文件中的条目不是文件。但是,资源往往是 jar 文件中的条目。

请注意,它是 YourClass.class.getResource,而不是 .getClass().getResource - 后者在子类化时可能会中断,而前者永远不会中断,因此在各个方面都更胜一筹。当有 2 种方法来做一件事情的可读性几乎相同,并且一种适用于比另一种严格更多的场景时,那么永远不要使用另一种。