導師需要我爲學校做一個地圖定位,需要事先將文件放置於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" , "如果沒保存則會獲得的數據" ); |
對其編輯的方法:
1 |
Editor
editor = sp.edit(); |
2 |
editor.putString(key,
value); |
3 |
editor.commit(); //一定不要忘記提交,否則就保存不到文件中。 |
1 |
context
=createPackageContext( "全包名" ,Context_CONTEXT_IGNORE_SECURITY); |
2 |
SharedPreferences
sp = context.getSharedPreferences( "存儲xml文件的名字" ,MODE_PRIVATE); |
需要說明的是,在PreferenceActivity中內置了對SharedPreferences的支持。如果希望進一步瞭解的用戶可以查看一下類似ListPreference的用法。
其次Android還提供了內部存儲方式,開發者可以將數據存儲在應用的私有空間中,避免其他程序訪問。其權限在Context下,有:MODE_PRIVATE,MODE_APPEND,MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE等。內部 存儲所在的目錄爲:/date/date/包.名/files
寫入數據可讀數據 也很簡單:
- private void createFile() {
- String filePath = fileDirPath + "/" + fileName;// 文件路徑
- try {
- File dir = new File(fileDirPath);// 目錄路徑
- if (!dir.exists()) {// 如果不存在,則創建路徑名
- System.out.println("要存儲的目錄不存在");
- if (dir.mkdirs()) {// 創建該路徑名,返回true則表示創建成功
- System.out.println("已經創建文件存儲目錄");
- } else {
- System.out.println("創建目錄失敗");
- }
- }
- // 目錄存在,則將apk中raw中的需要的文檔複製到該目錄下
- File file = new File(filePath);
- if (!file.exists()) {// 文件不存在
- System.out.println("要打開的文件不存在");
- InputStream ins = getResources().openRawResource(
- R.raw.flycatdeng);// 通過raw得到數據資源
- System.out.println("開始讀入");
- FileOutputStream fos = new FileOutputStream(file);
- System.out.println("開始寫出");
- byte[] buffer = new byte[8192];
- int count = 0;// 循環寫出
- while ((count = ins.read(buffer)) > 0) {
- fos.write(buffer, 0, count);
- }
- System.out.println("已經創建該文件");
- fos.close();// 關閉流
- ins.close();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }