在C++中,有一个ostream
的概念。cout
是ostream
,ofstream
也是。通过这种方式,您可以定义一个函数,该函数接受一个ostream并向其写入,这样调用方就可以决定将函数写入到哪里
有没有可能在kotlin中实现同样的效果:定义一个函数来确定它在运行时写入的位置(可能是控制台(?显然,if
或when
语句不起作用。
Kotlin(和Java(有两个等价物:OutputStream
用于字节流,Writer
用于字符流。这两个类都是抽象类,许多具体的子类写到不同的地方。
举个简单的例子:
-
如果要将字节数据写入文件,可以创建一个
FileOutputStream
实例,该实例将写入给定的文件名。(实现OutputStream
。( -
或者,如果您想写入stdout,可以直接使用
System.out
。(这也是OutputStream
。( -
或者,如果你有一个网络
Socket
,你可以调用它的getOutputStream()
方法,它会给你一个OutputStream
。 -
或者有一些实现可以写入字节数组、管道、CORBA流或…
因此,如果您有一些使用OutputStream
的代码,您可以为它提供这些类中任何一个的实例,当它调用OutputStream.write()
时,它将写入适当的位置。
(在实践中,为了提高效率,您经常将其封装在BufferedOutputStream
中。(
Writer
也非常相似,但在这种情况下,您通常必须告诉它使用哪种字符编码。(尽管在许多情况下,您可以将其留给平台默认值,通常为UTF-8。(
-
因此,如果要将字符数据写入文件,可以创建一个
FileWriter
实例,该实例将写入给定的文件名。 -
或者,如果您想写入stdout,您可以围绕
System.out
创建一个OutputStreamWriter
。 -
等等。
同样,如果您的代码被编写为接受任何Writer
,那么无论它向何处写入,它都会工作,并且有一个BufferedWriter
包装器可以提高效率。
输入也有等效的类:InputStream
用于字节流,Reader
用于字符流,这两个类都有许多用于不同源的实现。
java和kotlin:中有几个步骤
- 从文件、网络或任何其他可以为您提供这些流的资源中获取InputStream或OutputStream
- 您可以使用这些流来读取或写入它们,这些流最终从底层资源中读取或写入。(例如文件(
- 在操作结束时,您需要使用close((方法关闭相应的Streams
- 然后,您可以关闭资源,也可以不关闭资源,具体取决于您的用例
我建议您遵循Kotlin文档。
必看";使用";。(这就像Java对资源的尝试(