持久化技術(shù)--文件存儲(chǔ)
文件存儲(chǔ)是Android中最基本的一種數(shù)據(jù)存儲(chǔ)方式,它不對(duì)存儲(chǔ)的內(nèi)容進(jìn)行任何格式化的處理,所有的數(shù)據(jù)都是原封不動(dòng)的存儲(chǔ)到文件中,因而適合存儲(chǔ)一些簡(jiǎn)單的文本數(shù)據(jù)或者二進(jìn)制數(shù)據(jù)
文件存儲(chǔ)的核心技術(shù):使用Context
類中提供的openFileInput()
和openFileOutput()
方法
將文件存儲(chǔ)到文件中
使用文件存儲(chǔ),存儲(chǔ)的默認(rèn)路徑為(且不能更改):/data/data/<packageName>/files/目錄下
-
Context
類中提供了一個(gè)openFileOutput(String name, Int mode)
方法捆探,在文件存儲(chǔ)技術(shù)中實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)<name: 文件名稱 mode:文件的操作模式>
文件的操作模式,主要有兩種模式可以選擇:MODE_PRIVATE(默認(rèn)的操作模式):表示當(dāng)指定同樣文件名的時(shí)候站粟,所寫(xiě)的內(nèi)容將會(huì)覆蓋原文件中的內(nèi)容黍图;MODE_APPEND:表示如果該文件已存在就往文件里面追加內(nèi)容,不存在就創(chuàng)建新文件
指定的文件名不可以包含路徑
代碼如下:
/**當(dāng)活動(dòng)銷(xiāo)毀的時(shí)候奴烙,將界面上的文本框內(nèi)的內(nèi)容利用文件存儲(chǔ)技術(shù)存儲(chǔ)到文件中*/
public class MainActivity extends Activity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//假設(shè)界面上有一個(gè)輸入文本框
edit = (EditText) findViewById(R.id.edit);
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
public void save(String inputText) {
BufferedWriter writer = null;
try {
//通過(guò)Context類的openFileOutput方法拿到文件的輸出字節(jié)流助被,將此字節(jié)流包裝為帶緩沖區(qū)的字符輸出流
writer = new BufferedWriter(new OutputStreamWriter(openFileOutput("data", Context.MODE_PRIVATE)));
writer.write(inputText);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if (writer != null) {
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
從文件中讀取數(shù)據(jù)
使用文件存儲(chǔ)功能取出數(shù)據(jù),默認(rèn)的路徑(不可更改)是/data/data/<packageName>/files/
- Context類中提供了一個(gè)
openFileInput()
方法切诀,得到文件字節(jié)輸入流
更改以上代碼:(在onCreate()
中增加代碼并增加一個(gè)成員方法):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
String inputText = load();
//使用TextUtils類的isEmpty方法進(jìn)行雙重判斷揩环,文本內(nèi)容為null或者為空字符串則返回true
if (!TextUtils.isEmpty(inputText)) {
edit.setText(inputText);
//將光標(biāo)移到文本最后
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
}
}
public String load() {
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
//通過(guò)Context類的openFileInput()方法獲得文件輸入字節(jié)流,通過(guò)包裝得到帶緩沖區(qū)的字符串輸入流
reader = new BufferedReader(new InputStreamReader(openFileInput("data")));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
使用API獲取內(nèi)存存儲(chǔ)路徑
- (/data/data/(packageName)/files/)獲取此路徑對(duì)象幅虑,使用方法
public File getFilesDir ()
- (/data/data/(packageName)/cache/)獲取此路徑對(duì)象丰滑,使用方法
public File getCacheDir()
當(dāng)內(nèi)部存儲(chǔ)空間存儲(chǔ)不足時(shí),cache文件夾下的文件會(huì)被刪除
使用API獲取外部存儲(chǔ)路徑(sd卡真實(shí)路徑)
- (storage/sdcard0/)獲取此路徑對(duì)象倒庵,使用方法:
File Environment.getExternalStorageDirectory()
使用API獲取外部存儲(chǔ)的狀態(tài)
使用Environment.getExternalStorageState()
獲取狀態(tài)褒墨,常見(jiàn)狀態(tài):
- Environment.MEDIA_UNKNOWN:表示不能識(shí)別sd卡
- Environment.MEDIA_REMOVED:表示沒(méi)有sd卡
- Environment.MEDIA_UNMOUNTED:表示sd卡存在但是沒(méi)有掛載
- Environment.MEDIA_CHECKING:表示sd卡正在準(zhǔn)備
- Environment.MEDIA_MOUNTED:表示sd卡掛載炫刷,正常使用
使用API獲取外部存儲(chǔ)設(shè)備的容量
存儲(chǔ)設(shè)備都是分塊的
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲取外部存儲(chǔ)空間路徑
File path = Environment.getExternalStorageDirectory();
//創(chuàng)建StatFs對(duì)象,此對(duì)象可獲得存儲(chǔ)信息
StatFs stat = new StatFs(path.getPath());
long blockSize;
long availableBlocks;
//判斷當(dāng)期系統(tǒng)使用的版本號(hào)
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
//這兩個(gè)方法只有在 API level 18及以上才可以使用
//獲得存儲(chǔ)設(shè)備分塊大小
blockSize = stat.getBlockSizeLong();
//獲得存儲(chǔ)設(shè)備可用分塊數(shù)量
availableBlocks = stat.getAvailableBlocksLong();
}else {
blockSize = stat.getBlockSize();
availableBlocks = stat.getAvailableBlocks();
}
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(formatSize(availableBlocks * blockSize));
}
//將存儲(chǔ)設(shè)備可用大小轉(zhuǎn)換成合適的單位
private String formatSize(long size){
return Formatter.formatFileSize(this, size);
}
}