我尝试在resources文件夹中使用GSON编写一个JSON文件,而不使用src/main/resources:
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);
}
}
}
这似乎不起作用。我做错了什么?
1条答案
按热度按时间bq9c1y661#
我尝试在resources文件夹中使用GSON编写JSON文件
那是你的问题,因为那根本不可能
“resources”文件夹只存在于开发人员的计算机上。因此,您无法写入不存在的文件。
resources文件夹只用于只读资源,比如表格数据文件(比如国家名称和电话号码前缀的列表)、图标文件、HTML模板等。
您只能使用
GsonRepository.class.getResource
和(.getResourceAsStream
)加载这些文件-任何将它们视为文件的尝试都将在开发期间有效,然后在部署时失败。如果你有配置文件或保存文件,它们不会放在resources文件夹中,也不会用
.getResource
加载。你应该把它们放在用户的home目录(System.getProperty("user.home")
)中:java应用程序的安装目录将不能被应用程序本身写入(或者,如果可以,出于安全考虑,您的操作系统配置非常糟糕。Windows当然配置很糟糕。不过,这并不意味着开始将用户可编辑的数据文件粘贴到应用程序的安装目录中是一个好主意!)new FileWriter(this.getClass().getResource
这是没有意义的。在java中,
File
的意思是file。而资源是not a file-例如,jar文件中的条目不是一个文件。但是,资源往往是jar文件中的条目。注意它是
YourClass.class.getResource
,而不是.getClass().getResource
-后者可以在子类化时中断,而前者永远不会中断,因此在各方面都是上级的。当有两种方法来做一件事,在可读性上几乎是相同的,并且一种方法比另一种方法适用于更多的场景时,那么永远不要使用另一种。