Printwriter println: новая строка не создана - PullRequest
12 голосов
/ 12 декабря 2011

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

Все работает нормально, кроме метода 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 Ответ

22 голосов
/ 12 декабря 2011

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

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

...