问题
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();
}
}
回答1:
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
回答2:
Use
writer.print(str + "\n");
instead of
writer.println(str);
回答3:
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);
来源:https://stackoverflow.com/questions/7756799/why-this-simple-program-leads-to-different-carriage-return-line-feed-file-when-e