14天學會安卓開發(第七天)資料儲存之SharedPreferences與檔案
【原文:http://blog.csdn.net/corder_raine/article/details/8310130】
目錄
第七天.SharedPreferences與檔案... 79
7.1 SharedPreferences 79
7.1.1資料儲存方式... 79
7.1.2 SharedPreferences 79
7.1.3 SharedPreferences儲存資料... 80
7.1.4訪問SharedPreferences資料... 81
7.2 不同應用共享資料... 81
7.2.1 訪問其他應用SharedPreferences資料... 81
7.3 Android檔案操作... 82
7.3.1 檔案儲存... 82
7.3.2讀檔案操作... 82
7.3.3 寫檔案操作... 82
7.3.4讀取靜態檔案... 82
7.3.5使用檔案進行資料儲存... 83
7.3.6 讀取檔案內容... 83
7.4 SDCard檔案存取... 84
7.4.1 把檔案存放在SDCard. 84
第七天.SharedPreferences與檔案
7.1 SharedPreferences
7.1.1資料儲存方式
課程安排
Shared Preferences
儲存到檔案
SQLite資料庫
儲存到網路
內容提供者(Content provider)
7.1.2 SharedPreferences
如何儲存軟體配置引數:
Window: 採用ini檔案進行
j2se應用: 採用properties屬性檔案
Android平臺提供一個SharedPreferences類,它是一個輕量級的儲存類,適合用於儲存軟體配置引數。
使用SharedPreferences儲存資料,其背後是用xml檔案存放資料,檔案存放在/data/data//shared_prefs目錄下
7.1.3 SharedPreferences儲存資料
1
2
3
4
5
|
SharedPreferences
sharedPreferences =getSharedPreferences( "lxt008" ,
Context.MODE_PRIVATE); Editor
editor =sharedPreferences.edit(); //獲取編輯器 editor.putString( "name" , "lxt" ); editor.putInt( "age" , 35 ); editor.commit(); //提交修改 |
生成的lxt008.xml檔案內容如下:
1
2
3
4
5
|
<?xml
version=“ 1.0 ”
encoding=“utf- 8 ”
standalone=“yes” ?> <map> <string
name= "name" >lxt</string> < int name= "age" value=“ 30 "
/> </map> |
getSharedPreferences(name,mode)方法
引數1:指定該檔名稱,名稱不用帶字尾。
引數2:指定檔案的操作模式,共有四種操作模式。
1 Context.MODE_PRIVATE:為預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中。可以使用
2 Context.MODE_APPEND:模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案。
3-1 Context.MODE_WORLD_READABLE和
Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔案。
4-1 MODE_WORLD_READABLE:表示當前檔案可以被其他應用讀取;
4-2 MODE_WORLD_WRITEABLE:表示當前檔案可以被其他應用寫入。
getPreferences(mode)方法操作SharedPreferences,這個方法預設使用當前類不帶包名的類名作為檔案的名稱。
android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如檔案的時候,就需要userid匹配。
預設情況下,應用建立的檔案/sharedpreferences/資料庫都應該是私有的(位於/data/data/包名),其他程式無法訪問。
除非在建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程式才能正確訪問。
7.1.4訪問SharedPreferences資料
訪問SharedPreferences中的資料程式碼如下:
1
2
3
4
|
SharedPreferences
sharedPreferences =getSharedPreferences( "lxt008" ,
Context.MODE_PRIVATE); //getString()第二個引數為預設值,如果preference中不存在該key,將返回預設值 String
name =sharedPreferences.getString( "name" , "" ); int age
= sharedPreferences.getInt( "age" , 1 ); |
7.2.1 訪問其他應用SharedPreferences資料
訪問其他應用Preference,前提條件是:該preference建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE。
getSharedPreferences(“lxt008", Context.MODE_WORLD_READABLE);
其他應用要訪問上面應用的preference,首先需要建立上面應用的Context,然後通過Context訪問preference,訪問preference時會在應用所在包下的shared_prefs目錄找到preference :
1
2
3
4
|
Context
otherAppsContext =createPackageContext(“com.lxt008", Context.CONTEXT_IGNORE_SECURITY); SharedPreferences
sharedPreferences =otherAppsContext.getSharedPreferences(“lxt008", Context.MODE_WORLD_READABLE); String
name =sharedPreferences.getString( "name" , "" ); int age
=sharedPreferences.getInt( "age" , 0 ); |
Shared Preferences案例
參考:SharedPreferencesMidiPlayer
結果驗證
切換到DDMS檢視
選擇File Explorer標籤
/data/data/你的專案目錄/shared_prefs
7.3 Android檔案操作
7.3.1 檔案儲存
檔案可以儲存比使用引用更大數量的資料
Android 提供方法來讀、寫檔案
只有本地檔案可以被訪問
優點:可以儲存大容量的資料
缺點:檔案更新或是格式改變可能會導致巨大的程式設計工作
7.3.2讀檔案操作
Context.openFileInput(String name)
開啟一個與應用程式聯絡的私有檔案輸入流
當檔案不存在時丟擲FileNotFoundException
1
2
3
|
FileInputStream
in = this .openFileInput( "test.txt" ); //開啟檔案test.txt …… in.close(); //關閉輸入流 |
Context.openFileOutput(String name,int mode)
開啟一個與應用程式聯絡的私有檔案輸出流
當檔案不存在時該檔案將被建立
檔案輸出流可以在新增模式中開啟,這意味新的資料將被新增到檔案的末尾
1
2
3
|
FileOutputStream
out= this .openFileOutput( "test2.txt" ,MODE_APPEND); //開啟檔案"test2.txt"進行寫操作、使用MODE_APPEND
在新增模式中開啟檔案 …… out.close(); //關閉輸出流 |
要開啟打包在程式中的靜態檔案,使用Resources.openRawResource(R.raw.mydatafile)
該檔案必須放在資料夾res/raw/中
1
2
3
|
InputStreamin
= this .getResources().openRawResource(R.raw.my); … //獲得Context資源 in.close(); //關閉輸入流 |
檔案操作案例
參考:FileMidiPlayer
7.3.5使用檔案進行資料儲存
首先給大家介紹使用檔案如何對資料進行儲存,Activity提供了openFileOutput()方法可以用於把資料輸出到檔案中,具體的實現過程與在J2SE環境中儲存資料到檔案中是一樣的。
1
2
3
4
5
6
7
8
|
public class
FileActivity extends Activity{ @Override public
void
onCreate(Bundle savedInstanceState) { ... FileOutputStream
outStream = this .openFileOutput(“lxt008.txt",Context.MODE_PRIVATE); outStream.write(“lxt008".getBytes()); outStream.close(); } } |
openFileOutput()方法的第一引數用於指定檔名稱,不能包含路徑分隔符“/” ,如果檔案不存在,Android 會自動建立它。建立的檔案儲存在/data/data//files目錄,如:/data/data/com.lxt008/files/lxt008.txt,通過點選Eclipse選單“Window”-“Show
View”-“Other”,在對話視窗中展開android資料夾,選擇下面的File Explorer檢視,然後在File Explorer檢視中展開/data/data//files目錄就可以看到該檔案。
openFileOutput()方法的第二引數用於指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
7.3.6 讀取檔案內容
如果要開啟存放在/data/data//files目錄應用私有的檔案,可以使用Activity提供openFileInput()方法。
1
2
|
FileInputStream
inStream = this .getContext().openFileInput(“lxt008.txt"); Log.i( "FileTest" ,readInStream(inStream)); |
readInStream()的方法請看本頁下面備註。
或者直接使用檔案的絕對路徑:
1
2
3
|
File
file = newFile( "/data/data/com.lxt008/files/lxt008.txt" ); FileInputStream
inStream = new FileInputStream(file); Log.i( "FileTest" ,readInStream(inStream)); |
注意:上面檔案路徑中的“com.lxt008”為應用所在包,應替換為你自己應用使用的包。
對於私有檔案只能被建立該檔案的應用訪問,如果希望檔案能被其他應用讀和寫,可以在建立檔案時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE許可權。
Activity還提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用於獲取/data/data//cache目錄
getFilesDir()方法用於獲取/data/data//files目錄
7.4 SDCard檔案存取7.4.1 把檔案存放在SDCard
使用Activity的openFileOutput()方法儲存檔案,檔案是存放在手機空間上,一般手機的儲存空間不是很大,存放些小檔案還行,如果要存放像視訊這樣的大檔案,是不可行的。對於像視訊這樣的大檔案,我們可以把它存放在SDCard。 SDCard是幹什麼的?你可以把它看作是行動硬碟或U盤。
在模擬器中使用SDCard,你需要先建立一張SDCard卡(當然不是真的SDCard,只是映象檔案)。建立SDCard可以在Eclipse建立模擬器時隨同建立,也可以使用DOS命令進行建立,如下:
在Dos視窗中進入android SDK安裝路徑的tools目錄,輸入以下命令建立一張容量為2G的SDCard,檔案字尾可以隨便取,建議使用.img:
mksdcard 2048M D:\AndroidTool\sdcard.img
在程式中訪問SDCard,你需要申請訪問SDCard的許可權。
在AndroidManifest.xml中加入訪問SDCard的許可權如下:
1
2
3
4
|
<!--
在SDCard中建立與刪除檔案許可權 --> < uses-permission android:name = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!--
往SDCard寫入資料許可權 --> < uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" /> |
要往SDCard存放檔案,程式必須先判斷手機是否裝有SDCard,並且可以進行讀寫。
注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的許可權
1
2
3
4
5
6
7
|
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File
sdCardDir = Environment.getExternalStorageDirectory(); //獲取SDCard目錄 File
saveFile = new File(sdCardDir,
“lxt008.txt”); FileOutputStream
outStream = new FileOutputStream(saveFile); outStream.write(“lxt008".getBytes()); outStream.close(); } |
Environment.getExternalStorageState()方法用於獲取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄,當然要獲取SDCard的目錄,你也可以這樣寫:
1
2
|
File
sdCardDir = new File( "/sdcard" ); //獲取SDCard目錄 File
saveFile = new File(sdCardDir,
“lxt008.txt"); |
//上面兩句程式碼可以合成一句:
1
2
3
4
|
File
saveFile = new File( "/sdcard/lxt008.txt" ); FileOutputStream
outStream = new FileOutputStream(saveFile); outStream.write(“lxt008".getBytes()); outStream.close(); |
三個DEMO已經打包好
包括:
FileManagerDemo
FileMidiPlayer
SharedPreferencesMidiPlayer
原始碼下載
相關文章
- 安卓開發之資料儲存方式安卓
- 14天學會安卓開發(第八天)SQLite資料庫技術安卓SQLite資料庫
- Android資料儲存之SharedPreferences及如何安全儲存Android
- 14天學會安卓開發(第六天)Android Service安卓Android
- 14天學會安卓開發(第九天)ContentProvider與BroadcastReceiver安卓IDEAST
- Flutter 資料儲存 SharedPreferencesFlutter
- Android中的資料儲存之SharedPreferencesAndroid
- 14天學會安卓開發(第三天)UI事件處理與佈局管理安卓UI事件
- 14天學會安卓開發(第十天)Android網路與通訊安卓Android
- IOS資料儲存之檔案沙盒儲存iOS
- Android中資料儲存之SharedPreferencesAndroid
- 14天學會安卓開發(第十三天)Android多媒體開發安卓Android
- 資料儲存--檔案儲存
- 14天學會安卓開發(第一天)Android架構與環境搭建安卓Android架構
- Android中的資料儲存之檔案儲存Android
- 14天學會安卓開發(第四天)基礎UI控制元件安卓UI控制元件
- Android儲存之SharedPreferencesAndroid
- 十天學會php之第七天 (轉)PHP
- 14天學會安卓開發(第五天)高階UI控制元件安卓UI控制元件
- ORACLE資料檔案儲存之我見Oracle
- 14天學會安卓開發(第十四天)Android專案案例: mp3播放器安卓Android播放器
- 檔案系統儲存與oracle資料庫儲存對比Oracle資料庫
- Android開發 - 儲存輔助類 SharedPreferences 解析Android
- Android鍵值對儲存成XML檔案SharedPreferencesAndroidXML
- 14天學會安卓開發(第十二天)Android動畫技術安卓Android動畫
- HDU-安卓程式開發之簡單儲存/內部儲存/外部儲存 & 捉蟲安卓
- 資料倉儲建模工具之一——Hive學習第七天Hive
- 【Python3網路爬蟲開發實戰】5-資料儲存-1 檔案儲存-2 JSON檔案儲存Python爬蟲JSON
- 14天學會安卓開發(第十一天)Android圖形技術安卓Android
- Pandas之EXCEL資料讀取/儲存/檔案分割/檔案合併Excel
- Android SharedPreferences儲存資料使用例項分析Android
- IOS資料儲存之歸檔/解檔iOS
- Flutter持久化儲存之檔案儲存Flutter持久化
- 14天學會安卓開發(第二天)Android程式設計基礎activity和intent安卓Android程式設計Intent
- android: SharedPreferences儲存Android
- 資料檔案是否是smallfile型別檔案,其儲存是否達到資料檔案儲存上限,是否是多個資料檔案型別
- 機器學習之儲存與載入.pickle模型檔案機器學習模型
- 資料儲存(歸檔解檔,沙河儲存)