Kotlin - 写入未指定类型流的函数

Kotlin - Function that Writes to a Stream of Unspecified Type

在C++中,有一个ostream的概念。 coutostreamofstream 也是。通过这种方式,您可以定义一个函数,该函数接受一个 ostream 并写入它,以便调用者可以决定他希望函数写入的位置。

是否可以在 kotlin 中实现相同的效果:定义一个函数来确定它在运行时写入的位置(可能是控制台)?显然 ifwhen 语句不算数。

Kotlin(和 Java)有两个等价物:OutputStream for byte streams, and Writer 用于字符流。这些都是抽象的类,很多具体的sub类写到不同的地方

举个简单的例子:

  • 如果你想将字节数据写入文件,你可以创建一个 FileOutputStream 实例来写入给定的文件名。 (实现 OutputStream。)

  • 或者如果要写入stdout,可以直接使用System.out。 (那也是一个OutputStream。)

  • 或者如果你有一个网络 Socket, you can call its getOutputStream() 方法,它会给你一个 OutputStream.

  • 或者有一些实现可以写入字节数组,或者管道,或者CORBA流,或者...

因此,如果您有一些使用 OutputStream 的代码,您可以为它提供任何 类 的实例,当它调用 OutputStream.write() 时,它将写入合适的地方。

(在实践中,为了提高效率,您经常将其包装在 BufferedOutputStream 中。)

对于 Writer 也非常相似,但在那些情况下,您通常必须告诉它使用哪种字符编码。 (尽管在许多情况下您可以将其保留为平台默认值,通常是 UTF-8。)

  • 所以如果你想将字符数据写入文件,你可以创建一个 FileWriter 实例来写入给定的文件名。

  • 或者如果你想写入标准输出,你可以在 System.out.

    周围创建一个 OutputStreamWriter
  • 以此类推

同样,如果您的代码被编写为接受任何 Writer,那么无论写入何处,它都可以正常工作,并且有一个 BufferedWriter 包装器以提高效率。


对于输入也有等效的 类:对于字符流,InputStream for byte streams, and Reader,两者都有针对不同来源的大量实现。

java 和 kotlin 中的步骤很少:

  1. 从文件或网络或可以为您提供这些流的任何其他资源中获取 InputStreamOutputStream。 (Streams 的用法和名称因它们提供的抽象而异)
  2. 您可以使用这些 Streams 读取或写入它们,最终读取或写入底层资源。(例如文件)
  3. 在操作结束时,您需要使用 close() 方法关闭相应的流。
  4. 然后您可能会或可能不会关闭该资源,具体取决于您的用例。

我建议您遵循 Kotlin 文档。

一定要看"use"的用法。 (这就像 Java 的 try-with-resource)