Why this simple program leads to different carriage return/line feed file when executed in Java and AIX?
-
09-02-2021 - |
Question
If I run this simple program on Windows 7 and then on AIX (Unix system) and compare the two generated files using a tool such as Winmerge or Compare It, it tells me that the Carriage Return and Line Feed are different but the content identical.
Why is that? Isn't supposed to be the same if both use the same encoding "UTF-8" in this case?
How can I make both files totally equal?
public class WriteFile {
public static void main(String[] args) throws IOException {
write();
}
public static void write() throws IOException {
File file = new File("/tmp/test.txt");
file.delete();
file.createNewFile();
String str = "hello";
FileOutputStream fileOs = new FileOutputStream(file);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(fileOs, "UTF-8"), true);
writer.println(str);
writer.close();
}
}
Solution
Different operating systems use different newline conventions:
- On Windows, newlines are
CR+LF
; - On Unix, newlines are
LF
.
(If you're curious, there's more.).
If you need the output files to be identical, don't use println()
, but write \n
or \r\n
instead:
writer.printf("%s\n", str); // LF
writer.printf("%s\r\n", str); // CR+LF
OTHER TIPS
Use
writer.print(str + "\n");
instead of
writer.println(str);
Like it's been said, you should switch from using println(String) to print(String) or printf(String, ...)
Check out the documentation for println(String) (emphasis mine):
Prints a String and then terminates the line. This method behaves as though it invokes print(String) and then println().
And the docs for println():
Terminates the current line by writing the line separator string. The line separator string is defined by the system property line.separator, and is not necessarily a single newline character ('\n').
You can read about the line.separator
system property here.
I would go with aix's suggestion of using
writer.printf("%s\n", str);