Android File Example 示例

Android 中存取文件位置有三種,而且每種各有其讀取方式。

  1. apk 中的只讀資源文件
  2. SD 卡中的文件
  3. 數據區的文件(/data)

1. 資源文件的讀取

有兩種資源文件 rawassets,使用以下兩種不同的方式讀取:

val rawInputStream = context.resources.openRawResource(R.raw.test)
val assetsInputStream = context.assets.open(fileName) 

2. SD 卡數據讀寫

2.1 獲取權限

根據需要在 manifest 中加入以下內容:

<!--寫-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--讀-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--創建修改-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

2.2 判斷 SD 卡狀態

Environment.getExternalStorageState()

如果手機裝有 SDCard,并且可以進行讀寫,那么方法返回的狀態等于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. 數據區讀寫

3.1 寫操作

val fout = openFileOutput(fileName, Context.MODE_PRIVATE)

3.2 讀操作

val fin = openFileInput(fileName)

3.3 寫操作中的使用模式

MODE_APPEND:向文件尾寫入數據
MODE_PRIVATE:僅該程序可寫入數據
MODE_WORLD_READABLE:所有程序均可讀該文件數據
MODE_WORLD_WRITABLE:所有程序均可寫入數據

4. File 讀寫數據區示例

4.1 創建文件夾

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 復制

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 運行結果

點擊菜單 View -> Tool Windows -> Device File Explorer ,可查看當前虛擬機的文件系統,在 /data/user/0/me.xandeer.examples/files 中即可看到示例中添加的文件夾和文件。

4.9 其它鏈接

Github 源碼
File API

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • permissionn.允許;批準,正式認可,認可user permission 使用權限permission D...
    lengol閱讀 1,050評論 0 51
  • 【魚樂】 43*33*14 mm 魚樂一典,源出《莊子》,謂魚游水中,悠然自得。佛以其暗示超脫世間,自由豁達的修行...
    正等風來閱讀 458評論 1 1
  • 話說,待業季,學生時期攢的獎學金已花光,新的工作和工資還沒到手,正處于青黃不接的時間段。 不過,這是近年來和父母相...
    小猴子h閱讀 482評論 1 2
  • 口吃 > 治療、矯正與康復 不管你口吃多久,請接受這樣一個問題:你對“口吃”知己知彼嗎? 你為什么會卡住說不出話?...
    traveLightning閱讀 408評論 1 4