12

我正在尝试使用 Apache POI 类将 Outlook .MSG 文件解码为文本文件。

一切正常,除了: 它不创建新行的println方法。PrintWriter

它只是一个接一个地直接连接每个句子。下面代码片段的结果是

"de: textPara:" iso
“德:”
“帕拉:”

我在几台机器上尝试了代码:它在我的本地 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.");
        }

        }
4

1 回答 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()方法。

于 2011-12-12T16:01:08.997 回答