Запись в XML файл происходит долго

Рейтинг: -3Ответов: 1Опубликовано: 12.04.2023

Подскажите пожалуйста можно ли ускорить запись в XML файл, может быть есть другой способ записи, более быстрый?

public void test(List<Zapis> zapisList) {
    try (FileOutputStream out = new FileOutputStream(AppConstants.filePath + "file.xml")) {
        writeXML(out, zapisList);
    } catch (XMLStreamException | IOException e) {
        throw new RuntimeException(e);
    }
}

Метод записи

private void writeXML(OutputStream outputStream, List<Zapis> zapisList) throws XMLStreamException {
    XMLOutputFactory factory = XMLOutputFactory.newInstance();
    XMLStreamWriter writer = factory.createXMLStreamWriter(outputStream);

    writer.writeStartDocument("utf-8", "1.0");

    writer.writeStartElement("zl_list");

    Zglv zglv = new Zglv("1", "A", "1.14", UtilDate.getCurrentDate(), yearMonth);
    WriteXmlSegments.writeZglv(writer, zglv);

    for (Zapis zapis : zapisList) {
        WriteXmlSegments.writeZapis(writer, zapis);
    }

    for (Vrachi vrachi : vrachiList) {
        WriteXmlSegments.writeVrachi(writer, vrachi);
    }

    writer.writeEndElement();

    writer.writeEndDocument();

    writer.flush();
    writer.close();
}

В классе WriteXmlSegments тоже похожие методы, для записи сегментов. Если записей много (30000 тыс. например) долго идет запись.

Ответы

▲ 0

Как советовали выше использовал BufferedOutputStream , стало быстрее.

public void createFile(List<Zapis> zapisList) {
    try (FileOutputStream out = new FileOutputStream(AppConstants.filePath + AppConstants.FILE_NAME + yearMonth + ".xml");
         BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out)) {
        writeXML(bufferedOutputStream, ZapisList);
    } catch (XMLStreamException | IOException e) {
        Platform.runLater(() -> {
            mainController.getLogs().appendText(e.toString());
        });
    }
}

private void writeXML(BufferedOutputStream outputStream, List<Zapis> zapisList) throws XMLStreamException {
    XMLOutputFactory factory = XMLOutputFactory.newInstance();
    XMLStreamWriter writer = factory.createXMLStreamWriter(outputStream, "UTF-8");

    writer.writeStartDocument("utf-8", "1.0");

    writer.writeStartElement("list");

    Zglv zglv = new Zglv("1", "A", "1.14", UtilDate.getCurrentDate(), "file" + yearMonth);
    WriteXmlSegments.writeZglv(writer, zglv);

    for (Zapis zapis : zapisList) {
        WriteXmlSegments.writeZapis(writer, zapis);
    }

    for (Vrachi vrachi : vrachiList) {
        WriteXmlSegments.writeVrachi(writer, vrachi);
    }

    writer.writeEndElement();

    writer.writeEndDocument();

    writer.flush();
    writer.close();
}