Printwriter println: no new line created

nicBBB picture nicBBB · Dec 12, 2011 · Viewed 40.1k times · Source

I am trying to decode an outlook .MSG file to a text file, using Apache POI classes.

Everything works fine, except for the println method of PrintWriter: it doesn´t create a new line.

It just concatenates every sentence directly one after another. The result of the code snippet below is

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

I tried the code on several machines: it works on my local tomcat instalation (Windows machine), but fails on a tomcat or Weblogic instalation on a Solaris platform. I thought it had something to do with the encoding algorithm, so I used PrintStream in stead of Printwriter, indicating the encoding ISO-8859-1, but no luck neither.

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

        }

Answer

Alfredo Osorio picture Alfredo Osorio · Dec 12, 2011

Change the following:

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

This is related to how PrintWriter.println() generates the Line break depending of the Operating System. For unix systems is LF (\n), for Windows is CR+LF (\r\n).

Notice how I added the "\r\n" which means CR+LF and used print() instead of println(). This way the line break generated is not platform dependent.

You can also add the following method to your class to avoid duplicity and just call this custom println() instead of directly calling txtOut.print().

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

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

This way you just call println() method.