【问题标题】:Modify an InputStream and convert it to Outputstream修改 InputStream 并将其转换为 Outputstream
【发布时间】:2018-12-12 19:18:27
【问题描述】:

我正在开发一个程序,我在其中接收一个 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[] 变量中,因为我将在程序期间对其进行修改。

有什么想法吗?

提前非常感谢您! :)

【问题讨论】:

  • 您正在将流读入文档。您应该做的不是复制流 - 您应该将文档写入输出流。
  • 您已经将文档作为Document。您无需再次读取输入流。您可以处理“文档”。不清楚你在问什么。

标签: java xml inputstream outputstream


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2020-09-28
      • 2010-09-08
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2015-01-13
      相关资源
      最近更新 更多