Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编组JAXB对象会覆盖以前编组的文件_Java_Xml_Jaxb - Fatal编程技术网

Java 编组JAXB对象会覆盖以前编组的文件

Java 编组JAXB对象会覆盖以前编组的文件,java,xml,jaxb,Java,Xml,Jaxb,所以这里有一个有趣的问题我还没有解决。。。我将从代码开始,然后介绍一些背景知识 public void encodeElements(String path) throws Exception { LOGGER.warning("Marshalling config to " + path); JAXBContext ctx = JAXBContext.newInstance(RootElement.class); Marshaller marshaller = ctx

所以这里有一个有趣的问题我还没有解决。。。我将从代码开始,然后介绍一些背景知识

public void encodeElements(String path) throws Exception {
    LOGGER.warning("Marshalling config to " + path);
    JAXBContext ctx = JAXBContext.newInstance(RootElement.class);

    Marshaller marshaller = ctx.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    RootElement ele = new RootElement();
    ele.setDummyField("abc");

    QName qName = new QName("http://localhost/xml-schemas/mySchema", "rootelement");
    JAXBElement<RootElement> root = new JAXBElement<RootElement>(qName, RootElement.class, ele);

    marshaller.marshal(root, new FileOutputStream(path));
}
public void encodeElements(字符串路径)引发异常{
LOGGER.warning(“编组配置到”+路径);
JAXBContext ctx=JAXBContext.newInstance(RootElement.class);
Marshaller=ctx.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
RootElement ele=新的RootElement();
ele.setDummyField(“abc”);
QName QName=新的QName(“http://localhost/xml-schemas/mySchema“,”根元素“);
JAXBElement root=新的JAXBElement(qName,RootElement.class,ele);
marshaller.marshall(根,新文件输出流(路径));
}
此应用程序的GUI上有一个“另存为”选项。每次调用此函数时,它都会覆盖以前使用“另存为”功能保存的文件。例如:

  • 开放应用程序
  • 另存为“1.xml”-这里一切正常
  • 另存为-“2.xml”

    调用
    JAXBContext.newInstance()
    将用2.xml的内容覆盖1.xml,并创建有效的2.xml。区分这两个文件表明它们实际上是相同的。重复此过程始终会覆盖上次保存的文件。(即另存为3.xml将覆盖2.xml并创建相同的3.xml,依此类推)。

    在调试器中逐步完成这一过程已经向我展示了
    JAXBContext ctx=JAXBContext.newInstance(RootElement.class)是覆盖上一个文件的行。
    

    我不知道以前保存的文件中的信息是从哪里调用的。我已经开始钻研源代码(),这对我没有任何帮助。任何帮助或见解都将不胜感激。

    PS-该链接是正确的来源。我们在使用JAXB2.2.11的Java1.6平台上。任何对平台的蔑视都可以不说,因为我也有同感

问题出在这里:
marshaller.marshal(根,新文件输出流(路径))

写入完成后,传入的流不会关闭。因此,我们必须自己关闭它:

FileOutputStream fos = new FileOutputStream(path);
marshaller.marshal(root, fos);
fos.close();

感谢那些看了一眼的人。希望这有助于未来的人。

更好的帮助,考虑创建和发布一个。我们不想看到您的整个程序,但您应该将代码压缩为最小的代码位,它仍然可以编译,没有与您的问题无关的额外代码,但仍然可以演示您的问题。您可以通过简单地隔离和暴露bug来很好地解决问题。另外,请不要链接到代码。让你的问题尽可能容易回答符合你的最大利益。我猜你的问题与你发布的代码无关,问题在别处,但没有有效的MCVE,我无法测试或验证这一点。我看到你提供的链接是指向Java源代码的——我也落入了这个陷阱——相信这个错误不可能出现在我的代码中,我已经前后测试了它,所以这个错误一定是Java的错——我后来发现自己错了10000次。我猜你和我的几率一样大。首先假设这个bug是你的,首先隔离这个bug(mcve会有帮助),直到你能在这里发布一个有效的测试用例来证明它是Java的错误,继续假设它是你的。谢谢你的反馈。我将编辑我的帖子,使其符合这些准则。通过将源代码发布到Java,我并没有暗示这是Java的错;我只是一个孤独的开发者。我只是在发帖子,以防我对这一切如何协同工作的理解完全偏离了基准。