Spring 引导 jar 保存到现有文件
Spring Boot jar saving to existing file
我想用 jackson 将数据保存到现有文件(更新它),但是当我从 jar 运行 我的项目时它不会工作。
我需要将 json 用作 "database"(我知道这很愚蠢,但这是针对学校项目的)并且为了做到这一点,我在执行任何 CRUD 时加载并保存所有数据操作。当我用 运行 和 IDE 时它工作正常但是当我尝试作为 jar 时它在从 ClassPathResource
.
读取文件时遇到问题
所以我有这个方法来保存对文件的更改:
private List<Item> items;
private ObjectMapper mapper;
private ObjectWriter writer;
public void saveData() {
mapper = new ObjectMapper();
writer = mapper.writer(new DefaultPrettyPrinter());
try {
writer.writeValue(new ClassPathResource("items.json").getFile(), items);
} catch (IOException e) {
e.printStackTrace();
}
}
当我通过 IntelliJ 运行 它工作得很好,但当我 运行 它作为一个 jar 时它不会工作。
我找到了使用 this question 中的 InputStream
加载数据的解决方案,方法如下所示:
public void loadData() {
mapper = new ObjectMapper();
try {
ClassPathResource classPathResource = new ClassPathResource("items.json");
InputStream inputStream = classPathResource.getInputStream();
File tempFile = File.createTempFile("test", ".json");
FileUtils.copyInputStreamToFile(inputStream, tempFile);
System.out.println(tempFile);
System.out.println(ItemDao.class.getProtectionDomain().getCodeSource().getLocation().getPath().toString());
items = mapper.readValue(tempFile, new TypeReference<List<Item>>() {
});
} catch (IOException e) {
items = null;
e.printStackTrace();
}
}
但我仍然不知道如何实际保存更改。我正在考虑使用 FileOutputStream
但我一无所获。
所以我想让它在 jar 文件中工作并能够将更改保存到同一文件,提前感谢您的帮助!
当你想做read/write操作时,最好把文件放在项目之外。当 运行 jar 时,以路径作为参数传递文件名。像 -DfileName=/Users/chappa/Documents/items.json 等。这样,你就有了绝对路径,你可以对其执行 read/write 操作
如果您使用的是java 1.7 或更高版本,请使用以下方法写入数据。
要读取数据,您可以使用 jackson api 按原样加载 json 文件。
Path wipPath = Paths.get("/Users/chappa/Documents/items.json");
try (BufferedWriter writer = Files.newBufferedWriter(wipPath)) {
for (String record : nosRecords) {
writer.write(record);
}
}
以防万一如果您想使用 IO 流读取 json,您可以使用以下代码
Path wipPath = Paths.get("/Users/chappa/Documents/items.json");
try (BufferedReader reader = Files.newBufferedReader(wipPath)) {
String line=null;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
}
我想用 jackson 将数据保存到现有文件(更新它),但是当我从 jar 运行 我的项目时它不会工作。
我需要将 json 用作 "database"(我知道这很愚蠢,但这是针对学校项目的)并且为了做到这一点,我在执行任何 CRUD 时加载并保存所有数据操作。当我用 运行 和 IDE 时它工作正常但是当我尝试作为 jar 时它在从 ClassPathResource
.
所以我有这个方法来保存对文件的更改:
private List<Item> items;
private ObjectMapper mapper;
private ObjectWriter writer;
public void saveData() {
mapper = new ObjectMapper();
writer = mapper.writer(new DefaultPrettyPrinter());
try {
writer.writeValue(new ClassPathResource("items.json").getFile(), items);
} catch (IOException e) {
e.printStackTrace();
}
}
当我通过 IntelliJ 运行 它工作得很好,但当我 运行 它作为一个 jar 时它不会工作。
我找到了使用 this question 中的 InputStream
加载数据的解决方案,方法如下所示:
public void loadData() {
mapper = new ObjectMapper();
try {
ClassPathResource classPathResource = new ClassPathResource("items.json");
InputStream inputStream = classPathResource.getInputStream();
File tempFile = File.createTempFile("test", ".json");
FileUtils.copyInputStreamToFile(inputStream, tempFile);
System.out.println(tempFile);
System.out.println(ItemDao.class.getProtectionDomain().getCodeSource().getLocation().getPath().toString());
items = mapper.readValue(tempFile, new TypeReference<List<Item>>() {
});
} catch (IOException e) {
items = null;
e.printStackTrace();
}
}
但我仍然不知道如何实际保存更改。我正在考虑使用 FileOutputStream
但我一无所获。
所以我想让它在 jar 文件中工作并能够将更改保存到同一文件,提前感谢您的帮助!
当你想做read/write操作时,最好把文件放在项目之外。当 运行 jar 时,以路径作为参数传递文件名。像 -DfileName=/Users/chappa/Documents/items.json 等。这样,你就有了绝对路径,你可以对其执行 read/write 操作
如果您使用的是java 1.7 或更高版本,请使用以下方法写入数据。 要读取数据,您可以使用 jackson api 按原样加载 json 文件。
Path wipPath = Paths.get("/Users/chappa/Documents/items.json");
try (BufferedWriter writer = Files.newBufferedWriter(wipPath)) {
for (String record : nosRecords) {
writer.write(record);
}
}
以防万一如果您想使用 IO 流读取 json,您可以使用以下代码
Path wipPath = Paths.get("/Users/chappa/Documents/items.json");
try (BufferedReader reader = Files.newBufferedReader(wipPath)) {
String line=null;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
}