修改InputStream并将其转换为Outputstream

时间:2018-07-04 11:02:57

标签: java xml inputstream outputstream

我正在开发一个程序,我在其中接收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);
    }
}

我的问题是当我尝试读取函数copy中的XML时,因为该流已经关闭,所以出现异常。当我在程序开始时使用saxBuilder.build语句时,流将自行关闭。我之前无法将文本保存在byte[]变量中,因为我将在程序执行过程中对其进行修改。

有什么主意吗?

非常感谢您! :)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

感谢您的帮助!