Printwriter println:没有创建新行

nic*_*BBB 12 java solaris printwriter

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

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

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

"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.");
        }

        }
Run Code Online (Sandbox Code Playgroud)

Alf*_*rio 22

更改以下内容:

txtOut.print("De: "+displayFrom + "\r\n");
txtOut.print("Para: "+displayTo + "\r\n");
Run Code Online (Sandbox Code Playgroud)

这与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);
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以调用println()方法.

  • 而不是标记"\ r \n",更安全的方法可能是定义和使用:public static String newline = System.getProperty("line.separator"); (7认同)