Файл пуст после записи в файл, полученный с помощью classLoader - PullRequest
0 голосов
/ 16 марта 2020

Моя простая программа выглядит следующим образом:

import java.io.File;
import java.io.IOException;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;

public class ProgressionYAMLUtil {
    private final static File PROGRESSFILE_FILE = getProgressionFile();

    public static Boolean write(Progression progression) 
    {
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
        try {
            objectMapper.writeValue(PROGRESSFILE_FILE, progression);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public static Progression read() 
    {
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());

        Progression progression = null;
        try {
            progression = objectMapper.readValue(PROGRESSFILE_FILE, Progression.class);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

        return progression;
    }

    private static File getProgressionFile() {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        File file = new File(classLoader.getResource("progress.yaml").getFile());
        return file;
    }

    public static void main(String[] args) {

        Progression p1 = new Progression("foo");

        p1.newRun(2);
        p1.newRun(9);
        p1.newRun(11);

        System.out.println("WRITE");
        System.out.println(p1);

        Boolean b = write(p1);
        System.out.println("write successfull: " + b);


        System.out.println("READ");
        Progression p2 = read();
        System.out.println(p2);
    }
}

По какой-то причине после запуска этого кода мой progress.yaml файл все еще пуст. Программа работает нормально, и распечатка очень ожидаемая:

WRITE
Progression: foo

0 - 2
1 - 9
2 - 11

write successfull: true

READ
Progression: foo

0 - 2
1 - 9
2 - 11

Если я запускаю основной метод без блока записи, программа все равно успешно читает. Как он может читать контент, которого там нет? Я посмотрел на inte rnet, есть ли какой-нибудь файловый кеш, который я должен очистить, чтобы лучше понять проблему, но я вышел коротко.

Если я изменю оператор writeValue в методе write на objectMapper.writeValue(new File("src/main/resources/progress.yaml"), progression);, то есть при получении файла без classLoader, программа запишет в файл, и изменения станут видимыми.

Как это случилось? Спасибо за помощь:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...