推薦文章:
一文帶你看懂JAVA IO流,史上最全面的IO教學(xué)啦
IO流很簡(jiǎn)單,掌握幾個(gè)概念用起來就沒問題了:字節(jié)流 字符流 InputStream OutputStream
新任務(wù)是下載apk,并進(jìn)行安裝;現(xiàn)在后臺(tái)未開發(fā),先做一個(gè)模擬下載。把文件放在raw文件夾中,通過IO流傳輸?shù)轿募小?/p>
注意:1.IO操作為耗時(shí)操作,不能放在主線程
示例
先寫一個(gè)獲取要輸出的文件方法
/**
* 獲取外部存儲(chǔ)地址
*/
private fun getExternalStorageDirectory(): File {
// 獲取外部存儲(chǔ)地址
val externalDir = Environment.getExternalStorageDirectory().let {
File(it, resources.getString(R.string.app_name)).apply {
mkdirs()
}
}
return if (externalDir != null && externalDir.exists()) {
// 獲取應(yīng)用的外部媒體文件目錄
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
}