Android開發(fā)學(xué)習(xí)教程(30)- Android數(shù)據(jù)存儲(chǔ)的幾種方式
—— 十七歲全力以赴,十八歲好好慶祝,F(xiàn)ighting!
Android存儲(chǔ)android四大組件之一,所以它的數(shù)據(jù)存儲(chǔ)方式在介紹四大組件的時(shí)候說明。
1、文件存儲(chǔ)
文件存儲(chǔ)不對(duì)存儲(chǔ)的內(nèi)容進(jìn)行任何的格式化處理,所有數(shù)據(jù)都是原封不動(dòng)地保存到文件當(dāng)中的,因而它比較適合用于存儲(chǔ)一些簡(jiǎn)單的文本數(shù)據(jù)或二進(jìn)制數(shù)據(jù)。文件存儲(chǔ)有兩種方式,一是存儲(chǔ)到手機(jī)內(nèi)存中(memory),一是存儲(chǔ)到sd卡中。
1.1 存儲(chǔ)到手機(jī)內(nèi)存中
Context類中提供了一個(gè) openFileOutput()方法,可以用于將數(shù)據(jù)存儲(chǔ)到指定的文件中:
??
openFileOutput(name, mode):
??
name:是文件名,注意這里指定的文件名不可以包含路徑,因?yàn)樗械奈募际悄J(rèn)存儲(chǔ)到/data/data/<
package
?name=
""
>/files/(等價(jià)于 getFilesDir())目 錄下 的
??
mode:是文件的操作模式 ,MODE_PRIVATE:默認(rèn)的操作模式,同名文件內(nèi)容會(huì)被覆蓋。MODE_APPEND則表示 如果該文件已存在就往文件里面追加內(nèi)容,不存在就創(chuàng)建新文件。
</
package
>
public
?void
?save(String data) {
????
FileOutputStream out =?
null
;
????
BufferedWriter writer =?
null
;
????
try
?{
????????
out = openFileOutput(
"content"
, Context.MODE_PRIVATE);
????????
writer =?
new
?BufferedWriter(
new
?OutputStreamWriter(out));
????????
writer.write(data);
????
}?
catch
?(IOException e) {
????????
e.printStackTrace();
????
}?
finally
?{
????????
try
?{
????????????
if
?(writer !=?
null
) {
????????????????
writer.close();
????????????
}
????????
}?
catch
?(IOException e) {
????????
}
????
}
}
public
?String read() {
????
FileInputStream in =?
null
;
????
BufferedReader reader =?
null
;
????
StringBuilder content =?
new
?StringBuilder();
????
try
?{
????????
in = openFileInput(
"content"
);
????????
reader =?
new
?BufferedReader(
new
?InputStreamReader(in));
????????
String line =?
""
;
????????
while
?((line = reader.readLine()) !=?
null
) {
????????????
content.append(line);
????????
}
????
}?
catch
?(IOException e) {
????????
e.printStackTrace();
????
}?
finally
?{
????????
if
?(reader !=?
null
) {
????????????
try
?{
????????????????
reader.close();
????????????
}?
catch
?(IOException e) {
????????????????
e.printStackTrace();
????????????
}
????????
}
????
}
????
return
?content.toString();
}
1.2 存儲(chǔ)到手機(jī)SD卡中
前面說的存儲(chǔ)到手機(jī)內(nèi)存,數(shù)據(jù)是存儲(chǔ)在應(yīng)用程序內(nèi)的,文件大小受到限制,而且數(shù)據(jù)隨著程序的卸載而自動(dòng)清除;當(dāng)要存儲(chǔ)大的文件時(shí),或者想數(shù)據(jù)不會(huì)隨著程序的卸載而自動(dòng)清除就可以使用sd卡方式存儲(chǔ)了。使用sd卡存儲(chǔ)主要是使用Environment這個(gè)類的功能。
注:在Android6.0之后讀寫SD卡等危險(xiǎn)的操作需要?jiǎng)討B(tài)申請(qǐng)存儲(chǔ)等權(quán)限。否則可能會(huì)報(bào)異常java.io.FileNotFoundException: /storage/emulated/0/test: open failed: EACCES (Permission denied)
第 1 步:在AndroidManifest清掉中添加所需權(quán)限
????
<uses-permission android:name=
"android.permission.READ_EXTERNAL_STORAGE"
>
????
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
>
</uses-permission></uses-permission>
第 2 步:動(dòng)態(tài)申請(qǐng)權(quán)限
requestPermissions(
new
?String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},?
101
);
第 3 步:使用Environment獲取SD目錄,讀寫數(shù)據(jù):
public
?void
?save(String data) {
????
try
?{
????????
// 獲取SDcard路徑
????????
File sdCardDir = Environment.getExternalStorageDirectory();
????????
// SDCard目錄:/mnt/sdcard
????????
String sdcardPath = sdCardDir.getAbsolutePath();
????????
File file =?
new
?File(sdCardDir,?
"test"
);
????????
RandomAccessFile raf =?
new
?RandomAccessFile(file,?
"rw"
);
????????
// 將文件記錄指針移動(dòng)最后
????????
raf.seek(file.length());
????????
// 輸出文件內(nèi)容
????????
raf.write(data.getBytes());
????????
raf.close();
????
}?
catch
?(Exception e) {
????????
e.printStackTrace();
????
}
}
public
?String read() {
????
StringBuilder sb =?
new
?StringBuilder();
????
// 獲取SDcard路徑
????
try
?{
????????
File sdCardDir = Environment.getExternalStorageDirectory();
????????
File file =?
new
?File(sdCardDir,?
"test"
);
????????
InputStream inputStream =?
new
?FileInputStream(file);
????????
int
?len =?
0
;
????????
byte
[] buffer =?
new
?byte
[
1024
];
????????
while
?((len = inputStream.read(buffer)) != -
1
) {
????????????
sb.append(
new
?String(buffer,?
0
, len));
????????
}
????????
// 關(guān)閉流
????????
inputStream.close();
????
}?
catch
?(Exception e) {
????????
e.printStackTrace();
????
}
????
return
?sb.toString();
}
2、SharedPreferences存儲(chǔ)
SharedPreferences類,它是一個(gè)輕量級(jí)的存儲(chǔ)類,適合用于保存軟件配置參數(shù)。SharedPreferences是使用鍵值對(duì)的方式來存儲(chǔ)數(shù)據(jù)的,存儲(chǔ)數(shù)據(jù)是以xml文件形式存儲(chǔ),文件存放在/data/data/your package name/shared_prefs目錄下。
public
?void
?save(String data) {
????
SharedPreferences preferences = getSharedPreferences(
"test"
, MODE_APPEND);
????
SharedPreferences.Editor editor = preferences.edit();
????
editor.putString(
"content"
, data);
????
editor.commit();
}
public
?String read() {
????
SharedPreferences preferences = getSharedPreferences(
"test"
, MODE_PRIVATE);
????
return
?preferences.getString(
"content"
,?
""
);
}
源碼鏈接:https://yunjunet.cn/876833.html