Как предотвратить изменение содержимого файла XML при возникновении исключения - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть XML-файл с некоторым содержанием. Я хочу изменить этот файл по запросу REST. При создании нового FileOutputStream весь контент стирается, и позже с моим кодом я могу добавить нужные данные в файл XML. Но после создания нового FileOutputStream, ЕСЛИ ИСКЛЮЧЕНО БРОШЕНО, весь контент стирается.

Как сохранить исходный контент из файла XML (Abc.xml), как есть, если выброшено исключение?

FileOutputStream fileOutputStream = null;
    try {
        validateXMLSchema("Abc.xsd", "Abc.xml");
        JAXBContext jc = JAXBContext.newInstance(Structure.class);
        Marshaller marshaller = jc.createMarshaller();
        fileOutputStream = new FileOutputStream(
            new File(System.getProperty("rootPath") + "/WEB-INF/classes"
                + "/" + "Abc.xml"));
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        Structure structure = new Structure();
        structure.setName("Types");
        ObjectFactory objectFactory = new ObjectFactory();

} catch (JAXBException e) {
        throw IlmODataExceptionBuilder.buildODataApplicationException(
            FILE_FORMAT_IS_INCORRECT_CREATE_FILE_AGAIN,
            HttpStatusCode.BAD_REQUEST, "Abc.xml");
    } catch (FileNotFoundException e) {
        throw IlmODataExceptionBuilder.buildODataApplicationException(
            FILE_NOT_FOUND, HttpStatusCode.BAD_REQUEST,
            "Abc.xml");
    } finally {
        if (fileOutputStream != null) {
        fileOutputStream.close();
        }
    }

Здесь метод validateXMLSchema () просто проверяет схему XML. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Хороший способ справиться с чем-то подобным - полагаться на обычную операцию переименования файла atomic-ish.

  1. создать временный файл
  2. записать вывод во временный файл
  3. если запись во временный файл успешно завершена, переименуйте его в «настоящее» имя файла
  4. если запись во временный файл не удалась, удалите временный файл
0 голосов
/ 05 сентября 2018

Не создавая ни одного типа FileOutputStream, ни аналогичного, до того, как вы выполнили работу, которая потенциально может завершиться с ошибкой.

Создание FileOutputStream подготавливает файловую систему к получению байтов файла путем создания файла. И если он уже существует, он сотрет существующий файл, а не просто создаст его.

Так что не делайте этого, пока не будете готовы стереть файл.

...