- InputStream 抽象类
- OutputStream 抽象类
- 案例:文件复制
想熟练使用字节流,首先要熟悉它的两个抽象类:InputStream
和 OutputStream
,并了解它们有哪些主要的函数。
一、InputStream 抽象类
InputStream
是字节输入流的根类,影响着字节输入流的行为,Kotlin 为 InputStream
类定义了很多扩展函数和属性,下面是一些主要的扩展函数。
(1). 返回字节缓冲区输入流:
fun InputStream.buffered(
bufferSize: Int = DEFAULT_BUFFER_SIZE // 缓冲区大小
): BufferedInputStream
(2). 返回字符缓冲区输入流,charset 是字符集,默认是 UTF-8:
fun InputStream.bufferedReader(
charset: Charset = Charsets.UTF_8 // 字符集
): BufferedReader
(3). 从输入流中复制数据到输出流,返回复制的字节数:
fun InputStream.copyTo(
out: OutputStream,
bufferSize: Int = DEFAULT_BUFFER_SIZE
): Long
(4). 将字节输入流转换为字符输入流 InputStreamReader
,charset 是字符集,默认是 UTF-8:
fun InputStream.reader(
charset: Charset = Charsets.UTF_8
): InputStreamReader
二、OutputStream 抽象类
OutputStream
是字节输出流的根类,影响着字节输出流的行为,Kotlin 为 OutputStream
类定义了很多扩展函数和属性,下面是一些主要的扩展函数。
(1). 返回字节缓冲区输出流:
fun OutputStream.buffered(
bufferSize: Int = DEFAULT_BUFFER_SIZE
): BufferedOutputStream
(2). 返回字符缓冲区输出流,charset 是字符集,默认是 UTF-8:
fun OutputStream.bufferedWriter(
charset: Charset = Charsets.UTF_8
): BufferedWriter
(3). 将字节输出流转换为字符输出流 OutputStreamWriter
,charset 是字符集,默认是 UTF-8:
fun OutputStream.writer(
charset: Charset = Charsets.UTF_8
): OutputStreamWriter
三、案例:文件复制
实现文件复制,数据源是文件,所以用到文件输入流 FileInputStream
,数据目的地也是文件,所以用到了文件输出流 FileOutputStream
。
FileInputStream
和 FileOutputStream
都属于底层流,在实际开发时为了提高效率可以使用缓冲流 BufferedInputStream
和 BufferredOutputStream
,使用字节缓冲流后就内置一个缓冲区,第一次调用 read
函数时尽可能多地从数据源读取数据到缓冲区,后续再用 read
函数时先观察缓冲区中是否有数据,如果有则读取缓冲区中的数据,如果没有再将数据源中的数据读入到缓冲区,这样可以减少直接读取数据源的次数。通过输出流调用 write
函数写入数据时,也先将数据写入到缓冲区,缓冲区满了之后再写入数据目的地,这样可以减少直接对数据目的地的写入次数。使用了缓冲字节流可以减少 I/O 操作次数,提高效率。
fun main(args: Array<String>?) {
FileInputStream("./TestDir/src.zip").use { fileInput ->
FileOutputStream("./TestDir/subDir/src.zip").use { fileOutput ->
val bufferInput = fileInput.buffered()
val bufferOutput = fileOutput.buffered()
bufferInput.copyTo(bufferOutput)
}
}
}
网友评论