Java JAXB构建了不正确的XML

Java JAXB构建了不正确的XML,java,jaxb,Java,Jaxb,我在使用JAXB将java对象写入XML文件时遇到一些问题 我的方法如下所示: public void printToXml(PNLExport export, String outputPath, boolean syso)throws Exception { FileOutputStream fos = null; try { fos = new FileOutputStream(outputPath); JAXBContext contxt

我在使用JAXB将java对象写入XML文件时遇到一些问题

我的方法如下所示:

public void printToXml(PNLExport export, String outputPath, boolean syso)throws Exception
{

    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(outputPath);
        JAXBContext contxt = JAXBContext.newInstance(PNLExport.class);
        Marshaller m = contxt.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        if(syso){
            System.out.println();
            m.marshal(export, System.out);
        }
        m.marshal(export, fos);     

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fos != null) {
                fos.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}//printToXml
关闭根元素标记后,它会显示一些奇怪的行为:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <PNLExport version="">
        <Header>
            <RecType>0</RecType>
            <DateFormat>DD.MM.YY</DateFormat>
            <TimeFormat>HH:MM</TimeFormat>
            <TimeMode>L</TimeMode>
            <GenDate>25.06.12</GenDate>
            <GenTime>09:45</GenTime>
        </Header>
        <Records>
            <Record>
                <FlightRecord>
                    <RecType>21</RecType>
                    <Carrier>HG</Carrier>
                    <FlightNumber>8332</FlightNumber>
                    <FlightDate>30.06.12</FlightDate>
                    <Departure>VIE</Departure>
                    <Destination>OLB</Destination>
                    <DepTime>09:40</DepTime>
                    <DesTime>11:30</DesTime>
                </FlightRecord>
                <PaxRecord>
                    <RecType>32</RecType>
                    <BookingNumber>11632</BookingNumber>
                    <PaxNumber>1</PaxNumber>
                    <Name>SCHABAUER,Franz</Name>
                    <Salutation>MR</Salutation>
                    <BookingState>OK</BookingState>
                    <TicketType>T</TicketType>
                </PaxRecord>
                <PaxRecord>
                    <RecType>32</RecType>
                    <BookingNumber>11632</BookingNumber>
                    <PaxNumber>2</PaxNumber>
                    <Name>SCHABAUER,Vera</Name>
                    <Salutation>MRS</Salutation>
                    <BookingState>OK</BookingState>
                    <TicketType>T</TicketType>
                </PaxRecord>
            </Record>
        </Records>
    .
    .
    .
    </PNLExport>
    rrier>
            <FlightNumber>8332</FlightNumber>
            <FlightDate>02.07.12</FlightDate>
            <Departure>VIE</Departure>
            <Destination>OLB</Destination>
            <DepTime>09:15</DepTime>
            <DesTime>10:55</DesTime>
        </FlightRecord>
        <FlightRecord>
            <RecType>21</RecType>
            <Carrier>HG</Carrier>
            <FlightNumber>8333</FlightNumber>
            <FlightDate>02.07.12</FlightDate>
            <Departure>OLB</Departure>
            <Destination>VIE</Destination>
            <DepTime>11:40</DepTime>
            <DesTime>13:20</DesTime>
        </FlightRecord>
        <FlightRecord>
            <RecType>21</RecType>
            <Carrier>HG</Carrier>
            <FlightNumber>8333</FlightNumber>
            <FlightDate>29.06.12</FlightDate>
            <Departure>OLB</Departure>
            <Destination>VIE</Destination>
            <DepTime>14:00</DepTime>
            <DesTime>15:40</DesTime>
        </FlightRecord>
    </Record>
</Records>
   </PNLExport>

0
年月日
嗯
L
25.06.12
09:45
21
汞
8332
30.06.12
争夺
OLB
09:40
11:30
32
11632
1.
谢鲍尔,弗兰兹
先生
好啊
T
32
11632
2.
夏鲍尔,维拉
夫人
好啊
T
.
.
.
载波>
8332
02.07.12
争夺
OLB
09:15
10:55
21
汞
8333
02.07.12
OLB
争夺
11:40
13:20
21
汞
8333
29.06.12
OLB
争夺
14:00
15:40
这里怎么了


奇怪的是,有时xml是完全正确的…

因为在所需内容之后出现在文件中的额外数据具有相同的结构,但数据不同,您很可能有两个线程调用此方法,有时两个线程都会写入同一个文件。

这样创建
FileOutputStream
只需打开文件进行写入。它不会删除文件以前的内容,而是用新内容覆盖它。如果旧内容比新内容长,则旧内容的后面部分仍将保留在文件中。这似乎正是这里发生的事情

解决此问题的最简单方法可能是在写入文件之前删除该文件(显然,只有在文件存在的情况下)