天天看點

Android 檔案存放路徑【轉】

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

對于assets目錄下的靜态資料,存在當檔案最大支援1mb的局限,讀取方式如下:

1

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();

2

public void begintransactionwithlistener(sqlitetransactionlistener transactionlistener);

3

public void endtransaction();

4

public void intransaction();

5

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");

接下來跟平常檔案一樣讀入 就ok了。

首先内部存儲路徑為/data/data/youpackagename/,下面講解的各路徑都是基于你自己的應用的内部存儲路徑下。所有内部存儲中儲存的檔案在使用者解除安裝應用的時候會被删除。

一、 files

1. context.getfilesdir(),該方法傳回/data/data/youpackagename/files的file對象。

2. context.openfileinput()與context.openfileoutput(),隻能讀取和寫入files下的檔案,傳回的是fileinputstream和fileoutputstream對象。www.2cto.com

3. context.filelist(),傳回files下所有的檔案名,傳回的是string[]對象。

4. context.deletefile(string),删除files下指定名稱的檔案。

二、cache

1. context.getcachedir(),該方法傳回/data/data/youpackagename/cache的file對象。

三、custom dir

getdir(string name, int mode),傳回/data/data/youpackagename/下的指定名稱的檔案夾file對象,如果該檔案夾不存在則用指定名稱建立一個新的檔案夾。

歡迎加群互相學習,共同進步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,轉載請注明出處!http://www.cnblogs.com/sunshine-anycall/p/3544141.html