【问题标题】:How to prevent an XML file content to be modified if exception is thrown如果抛出异常,如何防止修改 XML 文件内容
【发布时间】:2019-02-10 16:53:54
【问题描述】:

我有一个包含一些内容的 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 模式。 任何帮助表示赞赏。

【问题讨论】:

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


    【解决方案1】:

    处理此类事情的一个好方法是依靠通常原子式的文件重命名操作。

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

    【讨论】:

      【解决方案2】:

      在您完成可能因异常而失败的工作之前,不要创建任何类型的 FileOutputStream 或类似文件。

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

      所以,在你准备好擦除文件之前不要这样做。

      【讨论】:

        猜你喜欢
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        相关资源
        最近更新 更多