1. 程式人生 > >Android 檔案存放路徑和讀取方式

Android 檔案存放路徑和讀取方式

getExternalFilesDir();Environment.getExternalStorageState()

對於應用攜帶的靜態資料,可以放置在應用的assets目錄或者res,raw目錄下。

對於assets目錄下的靜態資料,存在當檔案最大支援1MB的侷限,讀取方式如下

InputStream is = getAssets().open("xxx.xx");



對於res,raw目錄下的檔案,可以通過如下方式讀取:

InputStream is = resources.openRawResource.(R.raw.xxx);


另外,Android還對建立快取提供了支援,通過getCacheDir()可以獲取應用的快取路徑
,在系統可用空間不足時,Android會清空快取,但對於開發者而言,不應維護過多的快取。使用者可以通過系統的設定來手動清空快取,有人也用這個快取來做圖片的快取,但是吧,雖然少了用了流量,但是對程式的效率來說就只是縮短了一個網路下載時間而已。開發者可以根據自己應用的特性來選擇是否使用這個快取空間。

Android支援在SD卡上的應用私有目錄,在Froyo版本後,通過getExternalFilesDir()可以獲得具體路徑。該路徑依賴與應用的包名,如果你包為hello.file那麼SD開上的應用私有目錄為\mnt\sdcard\Android\data\hello.file\files\.如果希望儲存在SD卡上的公共目錄下,可以通過getExternalStoragePublicDirectory()
公共目錄的具體路徑視需要儲存的檔案型別而定。

SD上的應用需要的快取較大,也可以在SD卡上建立快取目錄,在Froyo版本後,通過getExternalCacheDir()可以獲取應用在SD卡上的快取路徑。在使用SD卡目錄時,需注意SD卡是否掛載,可通過Environment.getExternalStorageState()方法進行判斷,如果返回值為Envirnment.MEDIA_MOUNTED表示SD卡處於掛載狀態,可以放心使用。

SQLite的中的事務處理。當需要一次性修改多個數據時,建議通過SQLite的事務處理進行批量處理,這有利於提高執行的效率。事務處理相關的方法如下:

public void beginTransaction();
public void beginTransactionWithListener(SQLiteTransactionListener transactionListener);
public void endTransaction();
public void inTransaction();
public void setTransactionSuccessful();

此外還有使用SharedPreferences來儲存的xml檔案,究其本質其實還是<key,value>值對。Android中XML檔案更多的用來維護應用或者系統的配置檔案,我們在開發中一般用SharedPreferences也是儲存一些應用的配置資訊,記錄使用者的某些操作,例如:使用者是不是第一次進入應用,使用者是否選擇了儲存使用者名稱和密碼和使用者的某些偏好設定等等,Android根據配置資訊是否對其他應用開放,SharedPreferences提供了兩種許可權,MODE_PRIVATE和MODE_WORLD_READABLE該資料存放在\data\data\包.名\shared_prefs資料夾下,副檔名為.xml。資料以這種形式儲存:

<map><boolean name="firstFlag" value="true" /></map>

獲取SharedPreferences的方法:(該變數一般作為全域性變數,放到Activity的OnCreate方法中初始化,我遇到有人在方法中獲取不到這個變數的錯誤,該成全域性的就獲取到了。)

SharedPreferences sp = getSharedPreferences("儲存xml檔案的名字",MODE_PRIVATE);
String msg = sp.getString("儲存的key","如果沒儲存則會獲得的資料");


msg就是你儲存的資料,如果沒有儲存,那麼獲得就是你後面設定的預設資料 

對其編輯的方法:

Editor editor = sp.edit();
editor.putString(key, value);
editor.commit();//一定不要忘記提交,否則就儲存不到檔案中。


如果希望配置資訊對其他應用開放,在設定許可權時,可使用 MODE_WORLD_READABLE,其他應用要獲得該配置資訊時,必須先獲取相應的上下文:

context =createPackageContext("全包名",Context_CONTEXT_IGNORE_SECURITY);
SharedPreferences sp = context.getSharedPreferences("儲存xml檔案的名字",MODE_PRIVATE);


在實際開發中,一定要對獲得context進行是否為null的判斷,有些時候我們打不開,或因許可權不足,或因為應用已經被使用者刪除。 
需要說明的是,在PreferenceActivity中內建了對SharedPreferences的支援。如果希望進一步瞭解的使用者可以檢視一下類似ListPreference的用法。 
其次Android還提供了內部儲存方式,開發者可以將資料儲存在應用的私有空間中,避免其他程式訪問。其許可權在Context下,有:MODE_PRIVATE,MODE_APPEND,MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE等。內部 儲存所在的目錄為:/date/date/包.名/files 

寫入資料可讀資料 也很簡單:

FileOutputStream fos = context.openFileOutput(file,Context_MODE_WORLD_WRITEABLE);
fos.write(bytes);
fos.close();
FileInputStream fis = context.openFileInput("fileName");