繼上篇數據存儲,現在我們來講講另外一種數據存儲,Files。本篇講述步驟如下:
- 1、溫故而知新,復習四種數據存儲的區別。
- 2、什麼是 Files 數據存儲。
- 3、什麼是 Properties ?
- 4、Properties 重要方法和屬性講解。
- 5、模擬用戶設置參數。
- 6、查看 Files 產生的文件。
1、溫故而知新,復習四種數據存儲的區別
Android 總共有4種數據存儲方式,具體解釋和列表如下:
- Shared Preferences
用來存儲“鍵-值”對的格式數據。是一個輕量級的鍵值對存儲機制,只可以存儲基本數據類型。
你可以參考上篇文章了解和使用它的用法:Android 小項目之--數據存儲【Shared Preferences】(附源碼)
- Files
它通過 FileInputStream 和 FileOutputStream 對文件進行操作。本篇將講述如何使用Files 數據存儲。
- SQLite
Android 提供的一個標准數據庫,支持SQL語句。
你可以參考這篇文章大致了解和使用它的用法:Android 小項目之--SQLite 使用法門 (附源碼)
- NetWork
通過網絡來存儲和獲得數據。
2、什麼是 Files 數據存儲
- File 就是把需要保存的東西通過文件的形式訊錄下來,當需要這些數據時,通過讀取這個文件來獲取這些數據。因為 Android 采用了 Linux 核心,所以在Android 系統中,文件也是Linux 的形式。
- Android 中可以在設備本身的的存儲或者外接的存儲設備中創建用於保存數據的文件。同時,在默認狀態下,文件是不能在不同的程序間共享的。
3、什麼是 Properties ?
Properties(屬性),可以把Properties繼承自Hashtable,理解成一個Hashtable ,不過唯一不同的是,Properties對應的“鍵-值”必須是字符串形式的數據類型。Files 數據存儲主要是使用 Properties 配合 FileInputStream或者FileOutputStream對文件寫入操作。
4、Properties 重要方法和屬性講解
公用方法:
- 返回值:String
方法:getProperty(String name, String defaultValue)
解釋:通過指定的 “name“ 即Key,搜索屬性,參數二為默認值,即通過Key找不到文件中的屬性時,要返回的默認值。
- 返回值:String
方法:getProperty(String name)
解釋:通過指定的 ”name“ 即為 Key,搜索屬性,沒有返回默認值。
- 無返回值:void
方法:list(PrintStream out)
解釋:通過PrintStream 列出可讀的屬性列表
- 無返回值:void
方法:list(PrintWriter writer)
解釋:通過PrintStream 列出可寫的屬性列表
- 無返回值:synchronized void
方法:load(InputStream in)
解釋:從指定的 ”inputStream “ 即輸出流,加載properties
- 無返回值:synchronized void
方法:loadFromXML(InputStream in)
解釋:從指定的 "InputStream" 即輸出流,加載一個以XML形式的 Properties
- 返回值:Enumeration<?>
方法:propertyNames()
解釋:返回所有包含在文件裡面的屬性名稱
- 無返回值:void
方法:save(OutputStream out, String comment)
解釋:注意,這種保存方法己經過時,Google 不推薦使用此種寫法,這種方法忽略任何IO 異常,所以在實際操作過程中,可能會發生不必要的異常。
- 返回值:object
方法:setProperty(String name, String value)
解釋:設置屬性,保存一個”鍵-值“對的屬性。
- 無返回值:synchronized void
方法:store(OutputStream out, String comment)
解釋:通過 FileOutputStream 打開對應的程序文件,然後通過Store 保存之前 Properties 打包好的數據。這裡備注可以為空。
- 無返回值:void
方法:storeToXML(OutputStream os, String comment)
解釋:通過FileOutputStream 打開對應的程序文件,將打包好的數據寫入到XML文件。
- 無返回值:synchronized void
方法:storeToXML(OutputStream os, String comment, String encoding)
解釋:通過FileOutputStream 打開對應的程序文件,將打包好的數據寫入到XML文件,第三個參數可以指定編碼。
5、模擬用戶設置參數
本篇還是以上篇例子為基礎,還是以保存音樂播放狀態來對Properties的使用進行大概的了解。本例中,實現了load方法,即加載用戶之前保存的屬性文件,然後通過獲取對應的KEY值為狀態賦值。此外還有一個save方法用來保存用戶退出程序時的播放狀態。
load方法代碼如下:
本篇Load方法代碼參考
void load()
{
Properties properties=new Properties();
try {
FileInputStream stream =this.openFileInput("music.cfg");
properties.load(stream);
} catch (FileNotFoundException e) {
// TODO: handle exception
return;
} catch (IOException e) {
// TODO Auto-generated catch block
return;
}
isplay=Boolean.valueOf(properties.get("isplay").toString());
}
注意:
- 1、 properties.load方法如果遇到錯誤將拋出 IOException 異常,並且使用的編碼為:ISO8859 - 1
- 2、加載的數據出現空格將會被忽略。
- 3、不要在你的Files 文件中加注釋 ,因為load的時候將會忽略你的注釋符號。
- 4、公認的轉義序列:“\”,“\ \”,“\ r”開始,“\ ñ”,“\!”,“\#”,“\ t”的,“\ b”與“\ f”的,和“\ uXXXX”(Unicode字符)。
save方法代碼參考:
Save 方法代碼參考
boolean save()
{
Properties properties =new Properties();
properties.put("isplay", String.valueOf(isplay));
try {
FileOutputStream stream=this.openFileOutput("music.cfg", Context.MODE_WORLD_WRITEABLE);
properties.store(stream, "");
} catch (FileNotFoundException e) {
// TODO: handle exception
return false;
}catch (IOException e) {
// TODO: handle exception
return false;
}
return true;
}
注意:
- 1、 properties.store方法如果出現錯誤將會拋出IOException異常。
- 2、properties 的KEY和value必須為 String 類型,如果不是String 類型將會拋出ClassCastException異常,請注意這點。
本篇全部代碼參考如下:
Files 文件操作代碼參考
package com.terry;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class sharedPreActivity extends Activity {
private TextView myTextView;
private CheckBox myBox;
private playMusic PLAYER=null;
private boolean isplay=false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myTextView=(TextView)findViewById(R.id.TextView01);
myBox=(CheckBox)findViewById(R.id.CheckBox01);
PLAYER=new playMusic(this);
/*
* 文件創建模式:Activity.MODE_APPEND
* 如果該文件已經存在,然後將數據寫入,而不是抹掉它現有文件的末尾。
*/
/*
* 文件創建模式:MODE_PRIVATE
* 默認模式,在那裡創建的文件只能由應用程序調用,即為私有的
*/
/*
* 文件創建模式:Activity.MODE_WORLD_READABLE
* 允許所有其他應用程序有讀取和創建文件的權限。
*/
/*
* 文件創建模式:Activity.MODE_WORLD_WRITEABLE
* 允許所有其他應用程序具有寫入、訪問和創建的文件權限。
*/
/*
* SharedPreferences---數據存儲之獲取
SharedPreferences settings=getPreferences(Activity.MODE_PRIVATE);
isplay=settings.getBoolean("isplay", false); //通過key值找到value,如果不存在即返回false
*/
load();
myBox.setChecked(isplay);
if(isplay){
myTextView.setText("當前音樂的播放狀態:開");
isplay=true;
PLAYER.Play();
}
else{
myTextView.setText("當前音樂的播放狀態:關");
}
myBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if(isChecked)
{
myTextView.setText("當前音樂的播放狀態:開");
isplay=true;
PLAYER.Play();
}
else{
myTextView.setText("當前音樂的播放狀態:關");
isplay=false;
PLAYER.FreeMusc();
}
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK){
/*
* SharedPreferences --數據存儲之保存
SharedPreferences uiState=getPreferences(0);
SharedPreferences.Editor editor=uiState.edit();
editor.putBoolean("isplay", isplay);
editor.commit();
*/
save();
if(isplay)
{
PLAYER.FreeMusc();
}
this.finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
void load()
{
Properties properties=new Properties();
try {
FileInputStream stream =this.openFileInput("music.cfg");
properties.load(stream);
} catch (FileNotFoundException e) {
// TODO: handle exception
return;
} catch (IOException e) {
// TODO Auto-generated catch block
return;
}
isplay=Boolean.valueOf(properties.get("isplay").toString());
}
boolean save()
{
Properties properties =new Properties();
properties.put("isplay", String.valueOf(isplay));
try {
FileOutputStream stream=this.openFileOutput("music.cfg", Context.MODE_WORLD_WRITEABLE);
properties.store(stream, "");
} catch (FileNotFoundException e) {
// TODO: handle exception
return false;
}catch (IOException e) {
// TODO: handle exception
return false;
}
return true;
}
}
6、查看 Files 產生的文件
上篇preferences 存儲數據時,文件保存在shared_prefs文件夾下,如果我們在 Files產生文件的時候沒有為其指定絕對路徑,那麼系統就會在 shared_prefs 相同的目錄中產生一個名為files 的文件夾,裡面就有我們寫入的數據。如圖:
運行效果如下:
Tip:如果你需要用一個文件來加載初始化程序 ,可以事先在目錄下res/raw/tempFile中建立一個靜態文件,這樣就可以通過Resources.openRawResource(R.raw.文件名)來返回一個文件流,直讀讀取文件。
就到這裡。
源碼下載:/Files/TerryBlog/FilesDemo.rar