一个IO流apk传输示例
2020-12-07 本文已影响0人
微风细雨007
推荐文章:
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
}