2011-12-12 12 views
11

Sto tentando di decodificare un file .MSG di Outlook in un file di testo, utilizzando le classi di POI di Apache.Printwriter println: nessuna nuova riga creata

Tutto funziona correttamente, ad eccezione del metodo println di PrintWriter: non crea una nuova riga.

Concatena ogni frase direttamente una dopo l'altra. Il risultato del frammento di codice che segue è

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

Ho provato il codice su più macchine: funziona sul mio Tomcat locale Installazione (macchina Windows), ma non riesce in un Tomcat o Weblogic instalation su una piattaforma Solaris. Ho pensato che avesse qualcosa a che fare con l'algoritmo di codifica, quindi ho usato PrintStream invece di Printwriter, indicando la codifica ISO-8859-1, ma senza fortuna neanche.

Qualche idea?

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

     } 
+2

cosa stai stampando? Una console, un file di registro, una casella di testo in un'app GUI, html? – nos

+1

Stai cercando di aggiungere una linea in più tra ogni linea. Prova 'txtOut.println()' subito dopo ogni volta che scrivi una riga. –

+0

Qual è l'output esatto che ci si aspetta, oltre a ciò che viene effettivamente prodotto? – Peter

risposta

21

modificare quanto segue:

txtOut.print("De: "+displayFrom + "\r\n"); 
txtOut.print("Para: "+displayTo + "\r\n"); 

Questo è legato al modo in PrintWriter.println() genera il Line break a seconda del sistema operativo. Per sistemi unix è LF (\ n), per Windows è CR + LF (\ r \ n).

Notate come ho aggiunto il "\ r \ n", che significa CR + LF e utilizzato print() al posto diprintln(). In questo modo l'interruzione di linea generata non dipende dalla piattaforma.

È inoltre possibile aggiungere il seguente metodo alla classe per evitare la duplicazione e chiamare semplicemente println() personalizzato anziché chiamare direttamente txtOut.print().

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

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

In questo modo basta chiamare println() metodo.

+7

Invece di etichettare "\ r \ n" potrebbe essere un metodo più sicuro per definire e utilizzare: public static String newline = System.getProperty ("line.separator"); – BlueVoid

+0

Problema risolto cambiando println per stampare + \ r \ n. Molte grazie. – nicBBB