web-dev-qa-db-ja.com

Printwriter println:改行は作成されません

Apache POIクラスを使用して、Outlookの.MSGファイルをテキストファイルにデコードしようとしています。

printlnPrintWriterメソッドを除いて、すべて正常に機能します。新しい行は作成されません。

すべての文を次々に直接連結するだけです。以下のコードスニペットの結果は次のとおりです。

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

        }
12
nicBBB

以下を変更します。

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そしてprintln()の代わりにprint()を使用しました。このように、生成される改行はプラットフォームに依存しません。

重複を避けるために次のメソッドをクラスに追加して、txtOut.print()を直接呼び出す代わりに、このカスタムprintln()を呼び出すこともできます。

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

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

このようにして、println()メソッドを呼び出すだけです。

22
Alfredo Osorio