美文网首页
Kotlin I/O 与文件管理(2)字节流

Kotlin I/O 与文件管理(2)字节流

作者: 狼性代码人 | 来源:发表于2019-06-26 07:41 被阅读0次
  • InputStream 抽象类
  • OutputStream 抽象类
  • 案例:文件复制

  想熟练使用字节流,首先要熟悉它的两个抽象类:InputStreamOutputStream,并了解它们有哪些主要的函数。

一、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

  FileInputStreamFileOutputStream 都属于底层流,在实际开发时为了提高效率可以使用缓冲流 BufferedInputStreamBufferredOutputStream,使用字节缓冲流后就内置一个缓冲区,第一次调用 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)
        }
    }
}

相关文章

网友评论

      本文标题:Kotlin I/O 与文件管理(2)字节流

      本文链接:https://www.haomeiwen.com/subject/zgctcctx.html