Printwriter println:没有创建新行

12
我正在尝试使用Apache POI类将Outlook .MSG文件解码为文本文件。除了PrintWriterprintln方法不换行外,一切正常。它只是将每个句子直接拼接在一起。下面的代码片段的结果是:
"De: textPara: " iso 
"De: "
"Para: "
我在几台机器上尝试了这段代码:在我的本地tomcat安装(Windows机器)上运行良好,但在Solaris平台上的tomcat或Weblogic安装上失败。我认为它与编码算法有关,因此我使用了PrintStream代替Printwriter,指定编码ISO-8859-1,但仍然没有成功。
有任何想法吗?
    try {
        byte [] msgByte = Base64.decodeBase64(msgBase64);

        InputStream inputMsg = new ByteArrayInputStream(msgByte);
        msg = new MAPIMessage(inputMsg);

        /* 1. Transform MSG to TXT. */
        try {
            txtOut = new PrintWriter(outputMsg);
            try {
                String displayFrom = msg.getDisplayFrom();
                txtOut.println("De: "+displayFrom);
            } catch (ChunkNotFoundException e) {
                _logger.info("Error extrayendo displayFrom: "+e);
            }
            try {
                String displayTo = msg.getDisplayTo();
                txtOut.println("Para: "+displayTo);
            } catch (ChunkNotFoundException e) {
                _logger.info("Error extrayendo displayTo: "+e);
            }

        } finally {
        if(txtOut != null) {
            txtOut.close();}
        else {
            _logger.error("No se ha podido parsear el mensaje.");
        }

        }

2
你要输出到哪里?控制台、日志文件、GUI应用程序中的文本框、HTML? - nos
1
你是否想在每行之间添加一行额外的内容?尝试在每次写入一行后立即使用 txtOut.println() - Bhesh Gurung
除了实际输出的内容,您期望的确切输出是什么? - Peter
@gurung:我会试一下。奇怪的是,它似乎在运行在Windows上的Tomcat上工作。 - nicBBB
1
@nos: 最终结果应该是一个使用Base64编码的文本文件。outputMsg的类型为ByteArrayOutputStream。我将ByteArrayOutputStream转换为字节数组,并对其进行Base64编码。 - nicBBB
显示剩余3条评论
1个回答

22

修改以下内容:

txtOut.print("De: "+displayFrom + "\r\n");
txtOut.print("Para: "+displayTo + "\r\n");

这与PrintWriter.println()如何根据操作系统生成换行符有关。对于Unix系统,是LF(\n),对于Windows,是CR + LF(\r\n)

请注意,我添加了\r\n,表示CR + LF并使用print()而不是println()。这样生成的换行符就不会依赖于平台。

您还可以将以下方法添加到您的类中,以避免重复,只需调用此自定义println()而不是直接调用txtOut.print()。

private static final String LINE_SEPARATOR = "\r\n";

public void println(String str) {
    txtOut.print(str + LINE_SEPARATOR);
}

这种方式只需调用println()方法。


7
不要在文本末尾添加"\r\n",一个更安全的方法是定义并使用以下代码:public static String newline = System.getProperty("line.separator"); - BlueVoid
1
问题已解决,将println更改为print + \r\n。非常感谢。 - nicBBB
实际上,\r\n 何时是平台相关的:它严格适用于 Windows 操作系统,在 Linux 中,该额外字符会产生噪音 ^M 字符。 - Raffaello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接