1

如果我在 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();
    }

}
4

3 回答 3

5

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

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

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

如果您需要输出文件相同,请不要使用println(),而是使用\nor\r\n代替:

writer.printf("%s\n", str);   // LF
writer.printf("%s\r\n", str); // CR+LF
于 2011-10-13T15:47:50.510 回答
3

利用

writer.print(str + "\n");

代替

writer.println(str);
于 2011-10-13T15:47:47.077 回答
1

就像有人说的那样,您应该从使用println(String)切换到print(String)printf(String, ...)

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

打印一个字符串,然后终止该行。该方法的行为就像调用 print(String)然后调用 println()一样。

以及println()的文档:

通过写入行分隔符字符串来终止当前行。行分隔符字符串由系统属性 line.separator 定义,不一定是单个换行符 ('\n')。

您可以在此处阅读有关line.separator系统属性的信息。

我会接受 aix 的使用建议

writer.printf("%s\n", str);
于 2011-10-13T16:12:53.403 回答