Printwriter println: новая строка не создана

Я пытаюсь декодировать файл Outlook.MSG в текстовый файл, используя классы POI Apache.

Все работает отлично, за исключением метода println PrintWriter: он не создает новую строку.

Он просто конкатенирует каждое предложение непосредственно один за другим. Ниже приведен фрагмент кода

"De: textPara: " iso 
"De: "
"Para: "

Я пробовал код на нескольких машинах: он работает на моей локальной установке tomcat (машина Windows), но не работает на установке tomcat или Weblogic на платформе Solaris. Я думал, что это как-то связано с алгоритмом кодирования, поэтому я использовал 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.");
        }

        }

Ответ 1

Измените следующее:

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().