美文网首页
一个IO流apk传输示例

一个IO流apk传输示例

作者: 微风细雨007 | 来源:发表于2020-12-07 16:29 被阅读0次

    推荐文章:

    一文带你看懂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
    }
    
    

    相关文章

      网友评论

          本文标题:一个IO流apk传输示例

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