Kotlin - 写入未指定类型流的函数
Kotlin - Function that Writes to a Stream of Unspecified Type
在C++中,有一个ostream
的概念。 cout
是 ostream
,ofstream
也是。通过这种方式,您可以定义一个函数,该函数接受一个 ostream 并写入它,以便调用者可以决定他希望函数写入的位置。
是否可以在 kotlin 中实现相同的效果:定义一个函数来确定它在运行时写入的位置(可能是控制台)?显然 if
或 when
语句不算数。
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 中的步骤很少:
- 从文件或网络或可以为您提供这些流的任何其他资源中获取 InputStream 或 OutputStream。 (Streams 的用法和名称因它们提供的抽象而异)
- 您可以使用这些 Streams 读取或写入它们,最终读取或写入底层资源。(例如文件)
- 在操作结束时,您需要使用 close() 方法关闭相应的流。
- 然后您可能会或可能不会关闭该资源,具体取决于您的用例。
我建议您遵循 Kotlin 文档。
一定要看"use"的用法。 (这就像 Java 的 try-with-resource)
在C++中,有一个ostream
的概念。 cout
是 ostream
,ofstream
也是。通过这种方式,您可以定义一个函数,该函数接受一个 ostream 并写入它,以便调用者可以决定他希望函数写入的位置。
是否可以在 kotlin 中实现相同的效果:定义一个函数来确定它在运行时写入的位置(可能是控制台)?显然 if
或 when
语句不算数。
Kotlin(和 Java)有两个等价物:OutputStream
for byte streams, and Writer
用于字符流。这些都是抽象的类,很多具体的sub类写到不同的地方
举个简单的例子:
如果你想将字节数据写入文件,你可以创建一个
FileOutputStream
实例来写入给定的文件名。 (实现OutputStream
。)或者如果要写入stdout,可以直接使用
System.out
。 (那也是一个OutputStream
。)或者如果你有一个网络
Socket
, you can call itsgetOutputStream()
方法,它会给你一个OutputStream
.或者有一些实现可以写入字节数组,或者管道,或者CORBA流,或者...
因此,如果您有一些使用 OutputStream
的代码,您可以为它提供任何 类 的实例,当它调用 OutputStream.write()
时,它将写入合适的地方。
(在实践中,为了提高效率,您经常将其包装在 BufferedOutputStream
中。)
对于 Writer
也非常相似,但在那些情况下,您通常必须告诉它使用哪种字符编码。 (尽管在许多情况下您可以将其保留为平台默认值,通常是 UTF-8。)
所以如果你想将字符数据写入文件,你可以创建一个
FileWriter
实例来写入给定的文件名。或者如果你想写入标准输出,你可以在
周围创建一个System.out
.OutputStreamWriter
以此类推
同样,如果您的代码被编写为接受任何 Writer
,那么无论写入何处,它都可以正常工作,并且有一个 BufferedWriter
包装器以提高效率。
对于输入也有等效的 类:对于字符流,InputStream
for byte streams, and Reader
,两者都有针对不同来源的大量实现。
java 和 kotlin 中的步骤很少:
- 从文件或网络或可以为您提供这些流的任何其他资源中获取 InputStream 或 OutputStream。 (Streams 的用法和名称因它们提供的抽象而异)
- 您可以使用这些 Streams 读取或写入它们,最终读取或写入底层资源。(例如文件)
- 在操作结束时,您需要使用 close() 方法关闭相应的流。
- 然后您可能会或可能不会关闭该资源,具体取决于您的用例。
我建议您遵循 Kotlin 文档。
一定要看"use"的用法。 (这就像 Java 的 try-with-resource)