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
- SD卡可用性檢查
當使用外部存儲時:
必須配置權限,當targetsdk>23(6.0)時,使用動態(tài)權限
請參考:http://www.itdecent.cn/p/8e37e9cf20a5
必須檢查外部存儲的可用性;
- 文件共享
應用間共享文件時,不要通過放寬文件系統(tǒng)權限的方式去實現(xiàn),而應使用FileProvider
請參考:http://www.itdecent.cn/p/bec4497c2a63
- 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