如果我在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()
,而是用n
或rn
代替:
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);