Изменить InputStream и преобразовать его в Outputstream - PullRequest
0 голосов
/ 04 июля 2018

Я занимаюсь разработкой программы, в которой я получаю XML-файл в виде InputStream. Я должен внести некоторые изменения, а затем вернуть его как OutputStream.

Вот мой код:

public void execute (InputStream xmlEntrada, OutputStream xmlSalida) {

    SAXBuilder saxBuilder = new SAXBuilder();
    Document document;

    String idDocCobro, idCobro;
    String sociedad, ejercicio, numDocCobro;

    try {

        document = saxBuilder.build(xmlEntrada);

        Element raiz = document.getRootElement();

        List piDocCobros = raiz.getChildren("Pagos");

        for (int i = 0; i < piDocCobros.size(); i++) {

               Element nodePiDocCobros = (Element) piDocCobros.get(i);

               sociedad = nodePiDocCobros.getChildText("Sociedad");
               ejercicio = nodePiDocCobros.getChildText("Ejercicio");
               numDocCobro = nodePiDocCobros.getChildText("NumDocumentoCobro");

               idDocCobro = sociedad + ejercicio + numDocCobro + System.currentTimeMillis();

               nodePiDocCobros.getChild("iddoccobro").setText(idDocCobro);

               List piCobros = nodePiDocCobros.getChildren("Pago");

               for (int y = 0; y < piCobros.size(); y++) {

                   Element nodePiCobros = (Element) piCobros.get(y);

                   nodePiCobros.getChild("iddoccobro").setText(idDocCobro);

                   idCobro = numDocCobro + System.currentTimeMillis();

                   nodePiCobros.getChild("idcobro").setText(idCobro);

                   List piDocumentosRel = nodePiCobros.getChild("DocumentosRelacionados").getChildren("DocumentoRelacionado");

                   for (int z = 0; z < piDocumentosRel.size(); z++) {

                       Element nodePiDocumentosRel = (Element) piDocumentosRel.get(z);

                       nodePiDocumentosRel.getChild("idcobro").setText(idCobro);

                   }

               }
        }  

        copy(xmlEntrada, xmlSalida);

    } catch (JDOMException | IOException e) {
        System.out.println(e.toString());
    }
}   

public static void copy(InputStream in, OutputStream out) throws IOException {

    byte[] buffer = new byte[1024];
    while (true) {
      int bytesRead = in.read(buffer);
      if (bytesRead == -1){
        break;
      }  
      out.write(buffer, 0, bytesRead);
    }
}

Моя проблема возникает, когда я пытаюсь прочитать XML в функции copy, потому что поток уже закрыт, поэтому я получаю исключение. Поток закрывается, когда я использую предложение saxBuilder.build в начале программы. Я не могу сохранить текст ранее в переменной byte[], потому что я изменю его во время программы.

Есть идеи?

Заранее большое спасибо! :)

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Как некоторые из вас сказали мне, я совершил глупую ошибку. Что мне нужно было сделать, это передать документ в OutputStream. Я сделал это со следующим фрагментом кода:

XMLOutputter xmlcode = new XMLOutputter();
xmlcode.output(document, xmlSalida);

Спасибо всем за помощь!

0 голосов
/ 04 июля 2018

InputStream, который вы прочитали, не является объектом, который содержит сделанные вами изменения. Ваши изменения находятся внутри объекта Document.

Это то, что вам нужно отправить в OutputStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...