Java.io.Writer的append和write方法有什么区别?

35
Java 的 java.io.Writer 接口有两个方法分别叫做 append 和 write。这两者之间有什么区别?它甚至说:

形如 out.append(c) 的调用与 out.write(c) 的调用完全相同

那么为什么要有两种方法名变体呢?

7个回答

43

append()和write()之间有一些细微的差别。您可以通过阅读Javadocs来解决所有这些问题。提示。;)

  • write只能接受不能为null的字符串,并返回void
  • append将接受任何CharSequence,可以为null,并返回Writer,以便可以链接。

write是在CharSequence可用之前创建的旧格式。

这些方法被重载,因此有一个

  • write(int)其中int被转换为char。append(char)必须是char类型。
  • write(char[] chars)接受字符数组,没有相应的append()。

那是否意味着我应该使用append而不是write?为什么他们不能将CharSequence写入重载也称为write,并使旧的write方法也返回writer呢? - Svish
3
当代码被编译时,返回类型是字节码签名的一部分,如果您不重新从源代码进行编译,您将无法使用新方法。在Java中,您可以用write(int)替换为write(char)(需要更改一些代码),但您肯定需要重新编译它。如果您没有偏好,我建议您使用append。它有这个名称的原因是为了与始终使用append的StringBuffer保持一致。StringBuilder/StringBuffer/Writer现在都共享Appendable接口。 - Peter Lawrey


6

Append()可以接受一个CharSequence,而write()则需要一个String

由于StringCharSequence的一种实现,因此您也可以将String传递给append()。但您还可以将StringBuilderStringBuffer传递给append,而这是使用write()无法做到的。


5

从文档中可以看出,append方法还会返回你刚刚写入的Writer对象,这样你就可以执行多个追加操作,例如:

out.append(a).append(b).append(c)

2

Writer.append(c)返回的是Writer实例。因此,您可以链接多个调用以追加文本,例如out.append("Hello").append("World");


1

在我看来,这似乎是Appendable接口的副产品,java.io.Writer实现了该接口以提供与java.util.Formatter的兼容性。正如您所指出的,文档指出对于java.io.Writer,这两种方法之间没有实际区别。


0
上面所述的是真实的。不同版本的BufferWriterappend()方法返回一个Writer,它实现了Appendable等接口,从而使您能够链接调用。此外,append()允许您传递CharSequence以及char,而不是像write()方法那样传递intStringchar[]。一切正确。
然而,正如问题所述,需要指出一个重要问题,即append()的基本行为仍然与write()的基本行为相似。尽管命名有些误导,但现有文件内容将被覆盖,而不是追加,除非您的FileWriter以其他方式实例化:
try (var writer = new BufferedWriter(new FileWriter("myFile.txt", true));) {
    writer.append("XXX").append("ZZZ");
}

从这个意义上讲,我认为原问题提出了一个有效的观点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接