修改一个 InputStream 并将其转换为 Outputstream

Modify an InputStream and convert it to Outputstream

我正在开发一个程序,我接收一个 XML 文件作为 InputStream。我必须进行一些更改,然后 return 它作为 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);
    }
}

我的问题是当我尝试读取函数 copy 中的 XML 时,因为流已经关闭,所以我得到一个异常。当我在程序开头使用 saxBuilder.build 语句时,流会自行关闭。我无法将之前的文本保存在 byte[] 变量中,因为我将在程序中修改它。

有什么想法吗?

在此先感谢您! :)

您读取的 InputStream 不是包含您所做修改的对象。您的修改在 Document 对象中。

这就是您需要发送到 OutputStream 的内容。

正如你们中的一些人告诉我的那样,我犯了一个愚蠢的错误。我必须做的是将文档传递给 OutputStream。我用下一段代码做到了这一点:

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

感谢大家的帮助!