原汁原味的安卓檔案儲存(資料儲存系列)
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中找到檔案,如下圖:
在/data/data/com.example.filepersistencetest找到data檔案
開啟後可以看到就是剛剛退出Activity時候輸入的資料,說明檔案已經成功儲存。
取出資料
對應的我們也需要在用的時候再次取出資料,於是我們需要利用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/\
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儲存,這個儲存方式真的在工作中頻繁用到,謝謝各位觀看,敬請期待下一篇!
- 安卓開發一年技術小結——安卓開發技術整理
- 安卓Kotlin開發學習——接著看高階函式
- 兔兔按鈕——安卓懸浮按鈕
- 兔兔進度條Plus——SeekBar充當Progress
- 安卓基礎開發——ReentrantLock的簡單使用
- 安卓開發基礎——使用RecyclerView
- 安卓開發基礎(Java)——TextView的使用
- 安卓開發基礎——弱引用的使用
- 安卓開發基礎——實現音訊檔案的播放
- 讓UI忙碌的安卓Lottie動畫渲染庫(二)
- 強大而靈活的RecyclerView Adapter——BRVAH(框架引入與BaseQuickAdapter使用篇)
- 安卓語言基礎之Kotlin的面向物件程式設計
- 安卓語言基礎之Kotlin高階函式——Lambda表示式(二)
- 大放光彩的安卓Jetpack元件-ViewModel(一)
- 安卓語言基礎之Kotlin高階函式——Lambda表示式(一)
- 安卓開發必備——build.gradle檔案初探(一)
- 安卓開發學Flutter——Dart語法的一些注意點(第二篇)
- 簡單易用的安卓SharedPreferences儲存(資料儲存系列)
- 安卓開發基礎技術——WebView載入網頁
- 原汁原味的安卓檔案儲存(資料儲存系列)