如何在不使用 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 种方法来做一件事情的可读性几乎相同,并且一种适用于比另一种严格更多的场景时,那么永远不要使用另一种。
我正在尝试在不使用 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 种方法来做一件事情的可读性几乎相同,并且一种适用于比另一种严格更多的场景时,那么永远不要使用另一种。