原汁原味的安卓檔案儲存(資料儲存系列)

語言: CN / TW / HK

theme: fancy

本文正在參加「金石計劃 . 瓜分6萬現金大獎」

前言

上一篇我們簡單的瞭解了安卓資料儲存並初識了檔案儲存這個技術(Re:從零開始的安卓資料儲存學習生活(開篇) - 掘金 (juejin.cn))。本篇將進一步看看檔案儲存是怎麼用的。

正篇

概述

其實檔案儲存是安卓中最基本的資料儲存方式,所以說它原汁原味也不過分,它不會對儲存的內容進行任何格式化處理,用它儲存的資料都是原封不動的儲存在檔案中。\ 但這樣也就使得這種方式更適合儲存一些比較簡單的文字資料或是二進位制資料,其實如果真的想用檔案儲存的方式去儲存一些比較複雜的結構化資料,也可以定義一套自己的格式規範,以方便將資料從檔案中再次解析出來。\ 本篇使用一個完整的例子來說明檔案儲存的一些基本用法,暫不對相關複雜儲存說明。

存檔案

本例子是通過檔案儲存輸入框輸入的內容來實現下次重新啟動APP的輸入框中仍然可以顯示所輸入內容,這也是我們很多APP上表現的輸入歷史記錄一樣,不過我在業務中一般還是用資料儲存的第二種方式-SharedPreferences儲存。

我們首先在activity_main.xml佈局中新增一個EditText,作為我們的輸入框用來輸入儲存內容,程式碼如下: XML <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Please write something here" /> 接著在onDestroy()方法中我們呼叫save()方法,save()方法即我們利用檔案儲存存入資料的方法,這樣我們就能在Activity結束前把我們輸入的東西存入檔案中,程式碼如下: Kotlin override fun onDestroy() { super.onDestroy() val inputText = editText.text.toString() save(inputText) } Kotlin private fun save(inputText : String) { try { val output = openFileOutput("data", Context.MODE_PRIVATE) val write = BufferedWriter(OutputStreamWriter(output)) write.use { it.write(inputText) } } catch (e : IOException) { e.printStackTrace() } } 這個時候我們可以在AS的Device File Explorer中找到檔案,如下圖:

image.png

在/data/data/com.example.filepersistencetest找到data檔案 image.png image.png

開啟後可以看到就是剛剛退出Activity時候輸入的資料,說明檔案已經成功儲存。 image.png

取出資料

對應的我們也需要在用的時候再次取出資料,於是我們需要利用Context類中提供的另一個方法-openFileInput()方法,使用方法如下,我們將其封裝為load方法用於在onCreate方法呼叫,這樣開啟的APP就能獲取到之前輸入的資料並加載出來: //取出檔案中所儲存內容 private fun load() : String { //把檔案取出的資料一行行拼接在StringBuilder物件當中,用於返回內容(String) val content = StringBuilder() try { //獲取FileInputStream物件 val input = openFileInput("data") //構建BufferedReader物件 val reader = BufferedReader(InputStreamReader(input)) //讀取檔案內容 reader.use { //Kotlin提供的一個內建擴充套件函式,可以將讀到的每行內容都回調到Lambda表示式中,然後在Lambda表示式中完成拼接邏輯 reader.forEachLine { content.append(it) } } } catch (e: IOException) { e.printStackTrace() } return content.toString() } 該方法接受要讀取的檔名作為引數,系統自動到/data/data/\/files目錄下載入對應檔案,返回FileInputStream物件,我們再通過流的方式就可以將資料讀取出來。

image.png onCreate方法中呼叫的程式碼: Kotlin override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val inputText = load() //資料不為空則將內容填充到EditText中 if (inputText.isNotEmpty()) { editText.setText(inputText) //游標(焦點)位置移到文字末 editText.setSelection(inputText.length) //還原成功提示 Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show() } }

總結

檔案儲存不太適合儲存比較複雜的結構型資料,下一篇將探討一下我感覺更重要的Sp儲存,這個儲存方式真的在工作中頻繁用到,謝謝各位觀看,敬請期待下一篇!