如果引发异常,如何防止XML文件内容被修改

时间:2018-09-05 13:55:16

标签: java java-ee file-io jaxb fileoutputstream

我有一个包含一些内容的XML文件。我想在REST请求上修改此文件。在创建新的FileOutputStream时,所有内容都将被删除,以后再用我的代码将所需的数据添加到XML文件中。 但是在创建新的FileOutputStream后,如果抛出EXCEPTION,则所有内容都将被擦除。

如果引发异常,如何按原样保留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 :(得分:1)

处理类似问题的一种好方法是依靠通常原子化的文件重命名操作。

  1. 创建一个临时文件
  2. 将输出写入临时文件
  3. 如果临时文件写入成功完成,请将其重命名为“真实”文件名
  4. 如果临时文件写入失败,请删除临时文件

答案 1 :(得分:0)

在完成可能会因Exception失败的工作之前,请不要创建任何FileOutputStream或类似的文件。

创建FileOutputStream通过创建文件来准备文件系统以接收文件的字节。如果已经存在,它将删除现有文件,而不仅仅是创建它。

因此,在准备删除文件之前不要这样做。