Spring Boot jar保存到现有文件

时间:2019-05-20 22:10:53

标签: java spring spring-boot jackson fileoutputstream

我想用杰克逊将数据保存到现有文件(更新它),但是当我从jar中运行项目时,它将无法工作。

我需要将json用作“数据库”(我知道这很愚蠢,但这是针对学校项目的),要做到这一点,我在执行任何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文件中工作,并能够将更改保存到同一文件中,在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

当您要执行读/写操作时,最好将文件保留在项目之外。运行jar时,请以path为参数传递文件名。例如-DfileName = / Users / chappa / Documents / items.json等。这样,您就可以使用绝对路径,并且可以对其执行读/写操作

如果您使用的是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);
            }
        }