Сохранение Spring Boot jar в существующий файл - PullRequest
0 голосов
/ 21 мая 2019

Я хочу сохранить данные с Джексоном в существующий файл (обновить его), но он не будет работать, когда я запускаю свой проект из 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, но не работает, когда я запускаю его как банку.Я нашел решение для загрузки данных, используя 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 Ответ

1 голос
/ 21 мая 2019

когда вы хотите выполнять операции чтения / записи, лучше хранить файл вне проекта.при запуске jar передайте имя файла с путем в качестве аргумента.например -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);
            }
        }

На всякий случай, если вы хотите читать 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);
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...