【问题标题】:Kotlin - Function that Writes to a Stream of Unspecified TypeKotlin - 写入未指定类型流的函数
【发布时间】:2021-07-04 20:13:16
【问题描述】:

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

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

【问题讨论】:

  • @gidds 那么如何根据需要让 Writer 指向文件或标准输出?

标签: c++ kotlin stream stdout


【解决方案1】:

Kotlin(和 Java)有两个等价物:OutputStream 用于字节流,Writer 用于字符流。它们都是抽象类,有许多具体的子类写入不同的地方。

采取更简单的情况:

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

  • 或者如果你想写入标准输出,你可以直接使用System.out。 (这也是OutputStream。)

  • 或者,如果你有一个网络 Socket,你可以调用它的 getOutputStream() 方法,它会给你一个 OutputStream

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

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

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

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

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

  • 或者,如果您想写入标准输出,您可以在 System.out 周围创建一个 OutputStreamWriter

  • 等等。

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


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

【讨论】:

    【解决方案2】:

    java 和 kotlin 的步骤很少:

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

    我建议您遵循 Kotlin 文档。

    必看"use"的用法。 (就像 Java 的 try-with-resource)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多