在Java 8中以UTF-8编码漂亮地打印和写入XML。

14 浏览
0 Comments

在Java 8中以UTF-8编码漂亮地打印和写入XML。

我有一个XML文档的字符串,希望将其格式化(标签后换行和缩进)到文件中,目前在https://stackoverflow.com/a/25865324/3229995中的解决方案基本符合我的要求。

问题是,它使用了System.out,我想将输出写入文件,并确保保留UTF-8编码。

以下是我修改后的代码。它在一个测试XML字符串上运行并输出一个XML文件,如https://stackoverflow.com/a/25865324/3229995中所示。

我的问题是:

我需要刷新或关闭writer或out吗?

如果需要,在代码的哪个部分?

我担心如果没有刷新或关闭,可能会出现部分XML未输出的情况。

public static void main(String[] args) {
    String xmlString = "ME";
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    Document document = documentBuilder.parse(new InputSource(new StringReader(xmlString)));
    
    // NEW: 使用FileOutputStream和Writer
    OutputStream out = new FileOutputStream("/path/to/output.xml");
    Writer writer = new OutputStreamWriter(out, "UTF-8");
    pretty(document, writer, 2);
    
    // NEW: 关闭writer和out
    writer.close();
    out.close();
}
private static void pretty(Document document, Writer writer, int indent) throws Exception {
    document.setXmlStandalone(true);
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    if (indent > 0) {
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", Integer.toString(indent));
    }
    
    // NEW: 传递writer
    Result result = new StreamResult(writer);
    Source source = new DOMSource(document);
    transformer.transform(source, result);
}

0
0 Comments

在Java 8中,如何以UTF-8编码的格式进行漂亮的打印和写入XML?这个问题的出现原因是,开发者想要在Java中漂亮地打印和写入XML,并确保使用UTF-8编码。下面是问题的解决方法。

问题的解决方法是使用try-with-resources语句,并在使用完资源后关闭它们。这可以通过以下代码实现:

try (OutputStream out = new FileOutputStream("/path/to/output.xml");
    Writer writer = new OutputStreamWriter(out, "UTF-8")) {
    pretty(document, writer, 2);
}

这段代码首先创建一个输出流`out`,指向要写入的XML文件的路径。然后,创建一个使用UTF-8编码的字符输出流`writer`,将其与输出流`out`关联起来。接下来,调用`pretty`方法,将XML文档和字符输出流传递给它,同时指定缩进级别为2。最后,在try-with-resources语句的结束处,自动关闭字符输出流`writer`和输出流`out`。

关于代码中的`pretty`方法,这里没有给出具体实现。但是,它的作用是将XML文档格式化为漂亮的形式,并将其写入字符输出流。在这个问题中,重点是如何正确地使用字符输出流。

对于问题中提到的`StreamResult(writer)`和`transformer.transform(source, result)`,我们可以将它们理解为将XML文档写入字符输出流的过程。具体来说,`StreamResult(writer)`创建一个用于将XML文档写入字符输出流的`StreamResult`对象。然后,`transformer.transform(source, result)`将XML文档转换为字符输出流,并写入该流。所以,在调用`pretty`方法之后,我们可以安全地关闭字符输出流。

总之,问题的解决方法是使用try-with-resources语句,在使用完字符输出流后关闭它。这样做是为了确保资源被正确释放,并且能够以UTF-8编码格式漂亮地打印和写入XML。

0