What's up with Java's "%n" in printf?

JavaNewlinePrintf

Java Problem Overview


I'm reading Effective Java and it uses %n for the newline character everywhere. I have used \n rather successfully for newline in Java programs.

Which is the 'correct' one? What's wrong with \n ? Why did Java change this C convention?

Java Solutions


Solution 1 - Java

From a quick google:

> There is also one specifier that doesn't correspond to an argument. It is "%n" which outputs a line break. A "\n" can also be used in some cases, but since "%n" always outputs the correct platform-specific line separator, it is portable across platforms whereas"\n" is not.

Please refer https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Original source

Solution 2 - Java

%n is portable across platforms \n is not.

See the formatting string syntax in the reference documentation:

> 'n' line separator The result is the > platform-specific line separator

Solution 3 - Java

While \n is the correct newline character for Unix-based systems, other systems may use different characters to represent the end of a line. In particular, Windows system use \r\n, and early MacOS systems used \r.

By using %n in your format string, you tell Java to use the value returned by System.getProperty("line.separator"), which is the line separator for the current system.

Solution 4 - Java

Warning:

If you're doing NETWORKING code, you might prefer the certainty of \n, as opposed to %n which may send different characters across the network, depending upon what platform it's running on.

Solution 5 - Java

"correct" depends on what exactly it is you are trying to do.

\n will always give you a "unix style" line ending. \r\n will always give you a "dos style" line ending. %n will give you the line ending for the platform you are running on

C handles this differently. You can choose to open a file in either "text" or "binary" mode. If you open the file in binary mode \n will give you a "unix style" line ending and "\r\n" will give you a "dos style" line ending. If you open the file in "text" mode on a dos/windows system then when you write \n the file handling code converts it to \r\n. So by opening a file in text mode and using \n you get the platform specific line ending.

I can see why the designers of java didn't want to replicate C's hacky ideas regarding "text" and "binary" file modes.

Solution 6 - Java

Notice these answers are only true when using System.out.printf() or System.out.format() or the Formatter object. If you use %n in System.out.println(), it will simply produce a %n, not a newline.

Solution 7 - Java

In java, \n always generate \u000A linefeed character. To get correct line separator for particular platform use %n.

So use \n when you are sure that you need \u000A linefeed character, for example in networking.
In all other situations use %n

Solution 8 - Java

%n format specifier is a line separator that's portable across operating systems. However, it cannot be used as an argument to System.out.print or System.out.println functions.

It is always recommended to use this new version of line separator above \n.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionripper234View Question on Stackoverflow
Solution 1 - JavaBill KView Answer on Stackoverflow
Solution 2 - JavaGregory PakoszView Answer on Stackoverflow
Solution 3 - JavaCraig PutnamView Answer on Stackoverflow
Solution 4 - JavaGeorge FormanView Answer on Stackoverflow
Solution 5 - JavaPeter GreenView Answer on Stackoverflow
Solution 6 - Javauser1677663View Answer on Stackoverflow
Solution 7 - JavaFathah Rehman PView Answer on Stackoverflow
Solution 8 - JavaPiyush PatelView Answer on Stackoverflow