Android文件存放

導師需要我爲學校做一個地圖定位,需要事先將文件放置於sdcard中,所以在網上找了個實例,以下的代碼經過測試是可行的,望與後來者共勉。

sdcard路徑獲取:String path = Environment.getExternalStorageDirectory().getPath();

對於應用攜帶的靜態數據,可以放置在應用的assets目錄或者res,raw目錄下。
對於assets目錄下的靜態數據,存在當文件最大支持1MB的侷限,讀取方式如下

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

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

1 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的事務處理進行批量處理,這有利於提高執行的效率。事務處理相關的方法如下:

1 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方法中初始化,我遇到有人在方法中獲取不到這個變量的錯誤,該成全局的就獲取到了。)

1 SharedPreferences sp = getSharedPreferences("存儲xml文件的名字",MODE_PRIVATE);
獲得數據的方法: 
1 String msg = sp.getString("存儲的key","如果沒保存則會獲得的數據");
msg就是你保存的數據,如果沒有保存,那麼獲得就是你後面設置的默認數據 
對其編輯的方法: 

1 Editor editor = sp.edit();
2 editor.putString(key, value);
3 editor.commit();//一定不要忘記提交,否則就保存不到文件中。
如果希望配置信息對其他應用開放,在設置權限時,可使用 MODE_WORLD_READABLE,其他應用要獲得該配置信息時,必須先獲取相應的上下文: 
1 context =createPackageContext("全包名",Context_CONTEXT_IGNORE_SECURITY);
2 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 
寫入數據可讀數據 也很簡單: 
  1. private void createFile() {  
  2.         String filePath = fileDirPath + "/" + fileName;// 文件路徑  
  3.         try {  
  4.             File dir = new File(fileDirPath);// 目錄路徑  
  5.             if (!dir.exists()) {// 如果不存在,則創建路徑名  
  6.                 System.out.println("要存儲的目錄不存在");  
  7.                 if (dir.mkdirs()) {// 創建該路徑名,返回true則表示創建成功  
  8.                     System.out.println("已經創建文件存儲目錄");  
  9.                 } else {  
  10.                     System.out.println("創建目錄失敗");  
  11.                 }  
  12.             }  
  13.             // 目錄存在,則將apk中raw中的需要的文檔複製到該目錄下  
  14.             File file = new File(filePath);  
  15.             if (!file.exists()) {// 文件不存在  
  16.                 System.out.println("要打開的文件不存在");  
  17.                 InputStream ins = getResources().openRawResource(  
  18.                         R.raw.flycatdeng);// 通過raw得到數據資源  
  19.                 System.out.println("開始讀入");  
  20.                 FileOutputStream fos = new FileOutputStream(file);  
  21.                 System.out.println("開始寫出");  
  22.                 byte[] buffer = new byte[8192];  
  23.                 int count = 0;// 循環寫出  
  24.                 while ((count = ins.read(buffer)) > 0) {  
  25.                     fos.write(buffer, 0, count);  
  26.                 }  
  27.                 System.out.println("已經創建該文件");  
  28.                 fos.close();// 關閉流  
  29.                 ins.close();  
  30.             }  
  31.         } catch (Exception e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.     }  
接下來跟平常文件一樣讀入 就ok了。
發佈了18 篇原創文章 · 獲贊 17 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章