Android 中存取文件位置有三種募舟,而且每種各有其讀取方式。
- apk 中的只讀資源文件
- SD 卡中的文件
- 數(shù)據(jù)區(qū)的文件(/data)
1. 資源文件的讀取
有兩種資源文件 raw
和 assets
顾孽,使用以下兩種不同的方式讀取:
val rawInputStream = context.resources.openRawResource(R.raw.test)
val assetsInputStream = context.assets.open(fileName)
2. SD 卡數(shù)據(jù)讀寫
2.1 獲取權(quán)限
根據(jù)需要在 manifest
中加入以下內(nèi)容:
<!--寫-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--讀-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--創(chuàng)建修改-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
2.2 判斷 SD 卡狀態(tài)
Environment.getExternalStorageState()
如果手機裝有 SDCard,并且可以進行讀寫扳肛,那么方法返回的狀態(tài)等于Environment.MEDIA_MOUNTED
叔汁。
2.3 獲取 SD 卡根目錄
Environment.getExternalStorageDirectory()
2.4 讀寫
val file = File(Environment.getExternalStorageDirectory(), "a.txt")
val inputStream = FileInputStream(file)
val outStream = FileOutputStream(file)
3. 數(shù)據(jù)區(qū)讀寫
3.1 寫操作
val fout = openFileOutput(fileName, Context.MODE_PRIVATE)
3.2 讀操作
val fin = openFileInput(fileName)
3.3 寫操作中的使用模式
MODE_APPEND:向文件尾寫入數(shù)據(jù)
MODE_PRIVATE:僅該程序可寫入數(shù)據(jù)
MODE_WORLD_READABLE:所有程序均可讀該文件數(shù)據(jù)
MODE_WORLD_WRITABLE:所有程序均可寫入數(shù)據(jù)
4. File 讀寫數(shù)據(jù)區(qū)示例
4.1 創(chuàng)建文件夾
private fun makeDir() {
folder = File(filesDir, folderName)
if (folder.exists()) {
log("Directory \"${folder.path}\" existed.")
} else {
folder.mkdir()
log("Create directory \"${folder.path}\".")
}
}
4.2 新建并寫文件
private fun createFile() {
file = File(folder, fileName)
if (file.exists()) {
log("File \"${file.path}\" existed.")
} else {
try {
file.createNewFile()
file.appendText("Hello.\n")
log("Create \"${file.path}\" with \"Hello.\"")
} catch (e: Exception) {
e.printStackTrace()
}
}
}
4.3 讀文件
private fun readFile() {
if (file.isFile) {
try {
log("Content from \"${file.path}\": ${file.readText(Charset.forName("UTF-8"))}")
} catch (e: Exception) {
e.printStackTrace()
}
}
}
4.4 復(fù)制
private fun copyFile() {
copyFile = File(folder, copyName)
if (file.isFile && !copyFile.isFile) {
file.copyTo(copyFile)
log("Copy \"${file.path}\" to \"${copyFile.path}\"")
}
}
4.5 遍歷
private fun listFileNames() {
log("Files includes in ${folder.name}: ")
log("--------")
folder.listFiles().forEach {
log(it.name)
}
log("--------")
}
4.6 遞歸刪除文件夾
private fun deleteFolder() {
folder.deleteRecursively()
}
4.7 變量及其它
private fun log(msg: String) {
Log.d(javaClass.simpleName, msg)
outStr += msg
outStr += "\n\n"
}
private lateinit var folder: File
private lateinit var file: File
private lateinit var copyFile: File
private var outStr = ""
companion object {
private val folderName = "xandeer"
private val fileName = "a.txt"
private val copyName = "a_copy.txt"
}
4.8 運行結(jié)果
點擊菜單 View -> Tool Windows -> Device File Explorer
统求,可查看當(dāng)前虛擬機的文件系統(tǒng),在 /data/user/0/me.xandeer.examples/files
中即可看到示例中添加的文件夾和文件攻柠。