安卓編程技巧總結(4) 數(shù)據(jù)文件處理


1.文件與存儲路徑

文件、文件夾的創(chuàng)建均使用File類
File dir= new File(getExternalFilesDir(null).getPath()+"/a/b");
if (!dir.exists()) {
   dir.mkdirs();//遞歸創(chuàng)建目錄
}
File file = new File(getExternalFilesDir(null).getPath()+"/a.png");
if (!file.exists()) {
        file.createNewFile();//創(chuàng)建單個文件
}
不要硬編碼文件路徑,如:new File("/mnt/sdcard/tupian.jpg");
請使用 Android 文件系統(tǒng) API 訪問:

通過Environment獲取的:
Environment.getDataDirectory().getPath() //獲得根目錄/data (內部存儲路徑)
Environment.getDownloadCacheDirectory().getPath()  //獲得緩存目錄/cache
Environment.getExternalStorageDirectory().getPath() //獲得SD卡目錄/mnt/sdcard(獲取的是手機外置sd卡的路徑)
Environment.getRootDirectory().getPath()  //獲得系統(tǒng)目錄/system

通過Context獲取的:
Context.getDatabasePath() //返回通過Context.openOrCreateDatabase 創(chuàng)建的數(shù)據(jù)庫文件
Context.getCacheDir().getPath() //用于獲取APP的cache目錄 /data/data/<application package>/cache目錄
Context.getExternalCacheDir().getPath()//用于獲取APP的在SD卡中的cache目錄/mnt/sdcard/Android/data/<application package>/cache
Context.getFilesDir().getPath() //用于獲取APP的files目錄 /data/data/<application package>/files
Context.getObbDir().getPath() //用于獲取APP SDK中的obb目錄 /mnt/sdcard/Android/obb/<application package>
Context.getPackageName() //用于獲取APP的所在包目錄
Context.getPackageCodePath() //用于獲得當前應用程序對應的 apk 文件的路徑
Context.getPackageResourcePath() //用于獲取該程序的安裝包路徑
......

測試:

Activity中測試代碼(Context可以不寫):
        Log.i("File1",Environment.getDataDirectory().getPath()); //獲得根目錄/data (內部存儲路徑)
        Log.i("File2",Environment.getDownloadCacheDirectory().getPath());  //獲得緩存目錄/cache
        Log.i("File3",Environment.getExternalStorageDirectory().getPath()); //獲得SD卡目錄/mnt/sdcard(獲取的是手機外置sd卡的路徑)
        Log.i("File4",Environment.getRootDirectory().getPath());  //獲得系統(tǒng)目錄/system
        Log.i("File5",getCacheDir().getPath()); //用于獲取APP的cache目錄 /data/data/<application package>/cache目錄
        Log.i("File6",getExternalCacheDir().getPath());   //用于獲取APP的在SD卡中的cache目錄/mnt/sdcard/Android/data/<application package>/cache
        Log.i("File7",getFilesDir().getPath());  //用于獲取APP的files目錄 /data/data/<application package>/files
        Log.i("File8",getExternalFilesDir(null).getPath());//用于獲取APP的在SD卡中的file目錄/mnt/sdcard/Android/data/<application package>/file
        Log.i("File9",getCacheDir().getPath());//用于獲取APP的files目錄 /data/cache/<application package>/files
        Log.i("File10",getObbDir().getPath());  //用于獲取APP SDK中的obb目錄 /mnt/sdcard/Android/obb/<application package>
        Log.i("File11",getPackageName()); //用于獲取APP的所在包目錄
        Log.i("File12",getPackageCodePath());  //用于獲得當前應用程序對應的 apk 文件的路徑
        Log.i("File13",getPackageResourcePath());  //用于獲取該程序的安裝包路徑
輸出結果:
        03-01 15:08:31.453 13663-13663/? I/File1: /data
        03-01 15:08:31.453 13663-13663/? I/File2: /cache
        03-01 15:08:31.453 13663-13663/? I/File3: /storage/emulated/0
        03-01 15:08:31.453 13663-13663/? I/File4: /system
        03-01 15:08:31.453 13663-13663/? I/File5: /data/data/iwangzhe.paizhaocaiqie/cache
        03-01 15:08:31.453 13663-13663/? I/File6: /storage/emulated/0/Android/data/iwangzhe.paizhaocaiqie/cache
        03-01 15:08:31.453 13663-13663/? I/File7: /data/data/iwangzhe.paizhaocaiqie/files
        03-01 15:08:31.453 13663-13663/? I/File8: /storage/emulated/0/Android/data/iwangzhe.paizhaocaiqie/files
        03-01 15:08:31.453 13663-13663/? I/File9: /data/data/iwangzhe.paizhaocaiqie/cache
        03-01 15:08:31.453 13663-13663/? I/File10: /storage/emulated/0/Android/obb/iwangzhe.paizhaocaiqie
        03-01 15:08:31.453 13663-13663/? I/File11: iwangzhe.paizhaocaiqie
        03-01 15:08:31.453 13663-13663/? I/File12: /data/app/iwangzhe.paizhaocaiqie-1.apk
        03-01 15:08:31.453 13663-13663/? I/File13: /data/app/iwangzhe.paizhaocaiqie-1.apk
  1. SD卡可用性檢查
當使用外部存儲時:
必須配置權限,當targetsdk>23(6.0)時,使用動態(tài)權限
請參考:http://www.itdecent.cn/p/8e37e9cf20a5
必須檢查外部存儲的可用性;
  1. 文件共享
應用間共享文件時,不要通過放寬文件系統(tǒng)權限的方式去實現(xiàn),而應使用FileProvider
請參考:http://www.itdecent.cn/p/bec4497c2a63
  1. Sharepreference
SharedPreference 中只能存儲簡單數(shù)據(jù)類型(int、boolean、String 等),復雜數(shù)據(jù)類型建議使用文件、數(shù)據(jù)庫等其他方式存儲;
SharedPreference 最好封裝一下,且所有Key應該統(tǒng)一管理維護,否則容易出現(xiàn)數(shù)據(jù)存取錯亂,不好維護等現(xiàn)象;
SharedPreference 提 交 數(shù) 據(jù) 時 , 盡量使用 apply() , 而非commit(),原因:
-- apply 方法 進行提交會先寫入內存,然后異步寫入磁盤
-- commit 方法 是直接寫入磁盤。
方法優(yōu)缺點對比:
如果頻繁操作SharedPreference時 ,apply 的性能會優(yōu)于 commit;
如果希望立刻獲取存儲操作的結果,并根據(jù)結果做相應的其他操作時,應當使用 commit;

5.DB

-- 數(shù)據(jù)庫 Cursor 必須確保使用完后關閉,以免內存泄漏;
-- 多線程操作寫入數(shù)據(jù)庫時,需要使用事務,以免出現(xiàn)同步問題,因為transaction 是一次原子操作,因此處于事務中的操作是線程安全的,
如果多線程不使用事務,容易造成數(shù)據(jù)庫異常,提示數(shù)據(jù)庫已被鎖住。
-- 大數(shù)據(jù)寫入數(shù)據(jù)庫時,請使用事務或其他能夠提高 I/O 效率的機制,保證執(zhí)行速度;
-- 執(zhí)行 SQL 語句時,應使用 SQLiteDatabase#insert()、update()、delete(),盡量少使用 SQLiteDatabase#execSQL(),以免 SQL 注入風險;


第一篇: 安卓編程技巧總結(1) 資源與UI布局處理

http://www.itdecent.cn/p/ff97b15d5c9d

第二篇: 安卓編程技巧總結(2) 基礎組件開發(fā)

http://www.itdecent.cn/p/b05752377887

第三篇:安卓編程技巧總結(3) 進程與線程處理

http://www.itdecent.cn/p/7d05c8a368bd

第四篇:安卓編程技巧總結(4) 數(shù)據(jù)文件處理

http://www.itdecent.cn/p/0515df3b697d

第五篇:安卓編程技巧總結(5) 圖片處理

http://www.itdecent.cn/p/76690b2ba310

第六篇:安卓編程技巧總結(6) APP安全分析

http://www.itdecent.cn/p/4347ff392122

第七篇:安卓編程技巧總結(7) 性能檢測代碼分析

http://www.itdecent.cn/p/687f3c641408

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,618評論 19 139
  • 1、算法的概念 (1)概念:是指解題方案的準確而完整的描述。 【考題1】在計算機中,算法是指() A查詢方法B加工...
    成都小菜閱讀 1,897評論 0 15
  • 《裕語言》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 28,774評論 5 20
  • 《ilua》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 1...
    葉染柒丶閱讀 11,519評論 0 11
  • 如果是家人 還用得著時時刻刻費盡心機的經(jīng)營嗎? 家人,溫柔繾倦的字眼 家人,悅我心安的存在 我總以為是家人,所以肆...
    靜野閑談閱讀 172評論 0 0

友情鏈接更多精彩內容