Why this simple program leads to different carriage return/line feed file when executed in Java and AIX?

雨燕双飞 提交于 2019-12-08 05:28:54

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!