一个IO流apk传输示例

2020-12-07  本文已影响0人  微风细雨007

推荐文章:

一文带你看懂JAVA IO流,史上最全面的IO教学啦

Kotlin IO

IO流很简单,掌握几个概念用起来就没问题了:字节流 字符流 InputStream OutputStream

新任务是下载apk,并进行安装;现在后台未开发,先做一个模拟下载。把文件放在raw文件夹中,通过IO流传输到文件中。

注意:1.IO操作为耗时操作,不能放在主线程

示例

先写一个获取要输出的文件方法

/**
     * 获取外部存储地址
     */
    private fun getExternalStorageDirectory(): File {
        //  获取外部存储地址
        val externalDir = Environment.getExternalStorageDirectory().let {
            File(it, resources.getString(R.string.app_name)).apply {
                mkdirs()
            }
        }

        return if (externalDir != null && externalDir.exists()) {
            // 获取应用的外部媒体文件目录
            externalDir
        } else {
            // 获得文件存放路径,一般存放一些需要长期保留的文件
            // /data/data/<application package>/files目录
            filesDir
        }
    }

写入到文件中

 /**
     * 写入apk到文件中
     */
    private fun writeApkToPackageByByte() {
        //获取文件的输入流
        val inputStream = resources.openRawResource(R.raw.a2)

        //
        val outUnderDirectory = getExternalStorageDirectory()

        val file = File(outUnderDirectory, "app.apk")
        if (!file.exists()) {
            file.createNewFile()
        }

        try {
            val fos = file.outputStream()
            inputStream.copyTo(fos)
            fos.close()
            inputStream.close()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

其中使用了kotlin的拓展方法,源码如下

public fun InputStream.copyTo(out: OutputStream, bufferSize: Int = DEFAULT_BUFFER_SIZE): Long {
    var bytesCopied: Long = 0
    val buffer = ByteArray(bufferSize)
    var bytes = read(buffer)
    while (bytes >= 0) {
        out.write(buffer, 0, bytes)
        bytesCopied += bytes
        bytes = read(buffer)
    }
    return bytesCopied
}

上一篇下一篇

猜你喜欢

热点阅读