为什么这个简单的程序在Java和AIX中执行时会导致不同的回车/换行文件



如果我在Windows 7上运行这个简单的程序,然后在AIX (Unix系统)上运行,并使用Winmerge或compare It等工具比较两个生成的文件,它告诉我回车和换行不同,但内容相同。

  • 为什么?不应该是相同的,如果两者使用相同的编码"UTF-8"在这种情况下?

  • 如何使两个文件完全相等?

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();
    }
}

不同的操作系统使用不同的换行约定:

  • 在Windows上,换行符是CR+LF;
  • 在Unix上,换行符是LF

(如果你好奇,还有更多)。

如果您需要相同的输出文件,不要使用println(),而是用nrn代替:

writer.printf("%sn", str);   // LF
writer.printf("%srn", str); // CR+LF

使用

writer.print(str + "n");
不是

writer.println(str);

如前所述,您应该从使用println(String)切换到使用print(String)或printf(String,…)

查看println(String)(强调我的)文档:

打印String ,然后终止行。这个方法的行为如下虽然它先调用print(String) ,然后再调用println()

和println()的文档:

通过写入行分隔符字符串来终止当前行。的行分隔符字符串由system属性定义线。不一定是换行符(' n ') .

您可以在这里阅读line.separator系统属性。

我同意aix使用

的建议。
writer.printf("%sn", str);

最新更新