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

发布于 2024-12-09 23:52:31 字数 775 浏览 0 评论 0 原文

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

}

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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

萌辣 2024-12-16 23:52:31

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

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

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

如果您需要输出文件相同,请不要使用 println(),而应编写 \n\r\n

writer.printf("%s\n", str);   // LF
writer.printf("%s\r\n", str); // CR+LF

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
夏日浅笑〃 2024-12-16 23:52:31

使用

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

而不是

writer.println(str);

Use

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

instead of

writer.println(str);
纸短情长 2024-12-16 23:52:31

正如所说,您应该从使用 println(String)打印(字符串)< /a> 或 printf(String, ...)

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

打印字符串然后终止该行。该方法的行为如下
尽管它先调用 print(String) ,然后调用 println()

以及 println() 的文档

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

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

我会同意 aix 的使用建议

writer.printf("%s\n", str);

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文