Android 文件存儲(chǔ)與SharedPreferences存儲(chǔ)方式詳解用法
持久化技術(shù)簡(jiǎn)介
數(shù)據(jù)持久化就是指將那些內(nèi)存中的瞬時(shí)數(shù)據(jù)保存到存儲(chǔ)設(shè)備中,保證即使在手機(jī)或計(jì)算機(jī)關(guān)機(jī)的情況下,這些數(shù)據(jù)也不會(huì)丟失。保存在內(nèi)存中的數(shù)據(jù)是處于瞬時(shí)狀態(tài)的,而保存在存儲(chǔ)設(shè)備的數(shù)據(jù)是處于持久狀態(tài)的。持久化技術(shù)提供了一種機(jī)制,可以讓數(shù)據(jù)在瞬時(shí)狀態(tài)和持久狀態(tài)之間進(jìn)行切換
文件存儲(chǔ)
1. 將數(shù)據(jù)存儲(chǔ)到文件中
文件存儲(chǔ)是 Android 中最基本的數(shù)據(jù)存儲(chǔ)方式,它不對(duì)存儲(chǔ)的內(nèi)容進(jìn)行格式化處理,所有數(shù)據(jù)都是原封不動(dòng)的保存到文件當(dāng)中,適合存儲(chǔ)一些簡(jiǎn)單的文本數(shù)據(jù)或二進(jìn)制數(shù)據(jù)
Context
類提供了一個(gè) openFileOutput()
方法,可以將數(shù)據(jù)存儲(chǔ)到指定的文件中
fun save(inputText: String) { try { val output = openFileOutput("data", Context.MODE_PRIVATE) val writer = BufferedWriter(OutputStreamWriter(output)) writer.use { it.write(inputText) } } catch (e: IOException) { e.printStackTrace() } }
openFileOutput()
方法接收兩個(gè)參數(shù):
- 第一個(gè)參數(shù)是文件名,在文件創(chuàng)建的時(shí)候使用。指定的文件名可以不包含路徑,因?yàn)樗械奈募寄J(rèn)存儲(chǔ)到 /data/data/<package name>/files/ 目錄下
- 第二個(gè)參數(shù)是文件的操作模式,主要有
MODE_PRIVATE
和MODE_APPEND
兩種模式可選,默認(rèn)是MODE_PRIVATE
,表示當(dāng)指定相同文件名時(shí),所寫(xiě)入的內(nèi)容將會(huì)覆蓋原文件的內(nèi)容。而MODE_APPEND
則表示如果文件存在,就往文件追加內(nèi)容
2. 從文件中讀取數(shù)據(jù)
類似于將數(shù)據(jù)存儲(chǔ)到文件中,Context
類提供了一個(gè) openFileInput()
方法,用于從文件中讀取數(shù)據(jù)
fun load(): String { val content = StringBuilder() try { val input = openFileInput("data") val reader = BufferedReader(InputStreamReader(input)) reader.use { reader.forEachLine { content.append(it) } } } catch (e: IOException) { e.printStackTrace() } return content.toString() }
openFileInput()
方法只接收一個(gè)參數(shù),即要讀取的文件名,然后系統(tǒng)自動(dòng)到 /data/data/<package name>/files 目錄下加載這個(gè)文件
SharedPreferences 存儲(chǔ)
不同于文件存儲(chǔ),SharedPreferences 是使用鍵值對(duì)的方式來(lái)存儲(chǔ)數(shù)據(jù)的。也就是說(shuō),當(dāng)保存一條數(shù)據(jù)時(shí),需要給這條數(shù)據(jù)提供一個(gè)對(duì)應(yīng)的鍵。SharedPreferences 支持多種不同的數(shù)據(jù)類型存儲(chǔ)。
1. 將數(shù)據(jù)存儲(chǔ)到 SharedPreferences 中
要想使用 SharedPreferences,首先要獲得 SharedPreferences 對(duì)象。Android 中主要提供以下兩種方法用于得到 SharedPreferences 對(duì)象:
Context
類中的getSharedPreferences()
方法,此方法接收兩個(gè)參數(shù):第一個(gè)參數(shù)指定 SharedPreferences 文件的名稱,存放在 /data/data/<package name>/shared_prefs/ 目錄下;第二個(gè)參數(shù)指定操作模式,目前只有MODE_PRIVATE
可選,表示只有當(dāng)前應(yīng)用程序才可以對(duì)這個(gè) SharedPreferences 文件進(jìn)行讀寫(xiě)Activity
類中的getPreferences()
方法,它只接受一個(gè)操作模式參數(shù),因?yàn)槭褂眠@個(gè)方法會(huì)自動(dòng)將當(dāng)前 Activity 的類名作為 SharedPreferences 的文件名
得到 SharedPreferences 對(duì)象之后,就可以開(kāi)始向 SharedPreferences 存儲(chǔ)數(shù)據(jù)了
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { val editor = getSharedPreferences("data", Context.MODE_PRIVATE).edit() editor.putString("name", "Tom") editor.putInt("age", 28) editor.putBoolean("married", false) editor.apply() } }
2. 從 SharedPreferences 中讀取數(shù)據(jù)
SharedPreferences 對(duì)象提供了一系列 get 方法,用于讀取存儲(chǔ)的對(duì)應(yīng)類型的數(shù)據(jù)。這些 get 方法都接收兩個(gè)參數(shù):第一個(gè)參數(shù)是鍵,第二個(gè)參數(shù)是默認(rèn)值,表示傳入的鍵找不到對(duì)應(yīng)的值時(shí)以什么樣的默認(rèn)值來(lái)返回
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { val prefs = getSharedPreferences("data", Context.MODE_PRIVATE) val name = prefs.getString("name", "") val age = prefs.getInt("age", 0) val married = prefs.getBoolean("married", false) } }
到此這篇關(guān)于Android 文件存儲(chǔ)與SharedPreferences存儲(chǔ)方式詳解用法的文章就介紹到這了,更多相關(guān)Android 存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
android圖片文件的路徑地址與Uri的相互轉(zhuǎn)換方法
下面小編就為大家?guī)?lái)一篇android圖片文件的路徑地址與Uri的相互轉(zhuǎn)換方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Android開(kāi)發(fā)筆記之Intent初級(jí)學(xué)習(xí)教程
這篇文章主要介紹了Android開(kāi)發(fā)筆記之Intent初級(jí)學(xué)習(xí),較為詳細(xì)的分析了Android Intent項(xiàng)目的建立,功能實(shí)現(xiàn)及Intent使用技巧,需要的朋友可以參考下2016-02-02Android Studio生成函數(shù)注釋的實(shí)現(xiàn)方法
這篇文章主要介紹了Android Studio生成函數(shù)注釋的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文大家能夠?qū)崿F(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09如何利用Flutter實(shí)現(xiàn)酷狗流暢Tabbar效果
這篇文章主要給大家介紹了關(guān)于如何利用Flutter實(shí)現(xiàn)酷狗流暢Tabbar效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02Android自定義控件實(shí)現(xiàn)UC瀏覽器語(yǔ)音搜索效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)UC瀏覽器語(yǔ)音搜索效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Android 中ScrollView與ListView沖突問(wèn)題的解決辦法
這篇文章主要介紹了Android 中ScrollView與ListView沖突問(wèn)題的解決辦法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家掌握解決問(wèn)題的辦法,需要的朋友可以參考下2017-10-10Android 通過(guò)cmake的方式接入opencv的方法步驟
這篇文章主要介紹了Android 通過(guò)cmake的方式接入opencv的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04RecyclerView實(shí)現(xiàn)抖音縱向滾動(dòng)ViewPager效果
這篇文章主要為大家詳細(xì)介紹了RecyclerView實(shí)現(xiàn)抖音縱向滾動(dòng)ViewPager效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07