安卓编程技巧总结(4) 数据文件处理


1.文件与存储路径

文件、文件夹的创建均使用File类
File dir= new File(getExternalFilesDir(null).getPath()+"/a/b");
if (!dir.exists()) {
   dir.mkdirs();//递归创建目录
}
File file = new File(getExternalFilesDir(null).getPath()+"/a.png");
if (!file.exists()) {
        file.createNewFile();//创建单个文件
}
不要硬编码文件路径,如:new File("/mnt/sdcard/tupian.jpg");
请使用 Android 文件系统 API 访问:

通过Environment获取的:
Environment.getDataDirectory().getPath() //获得根目录/data (内部存储路径)
Environment.getDownloadCacheDirectory().getPath()  //获得缓存目录/cache
Environment.getExternalStorageDirectory().getPath() //获得SD卡目录/mnt/sdcard(获取的是手机外置sd卡的路径)
Environment.getRootDirectory().getPath()  //获得系统目录/system

通过Context获取的:
Context.getDatabasePath() //返回通过Context.openOrCreateDatabase 创建的数据库文件
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());  //获得系统目录/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)时,使用动态权限
请参考://www.greatytc.com/p/8e37e9cf20a5
必须检查外部存储的可用性;
  1. 文件共享
应用间共享文件时,不要通过放宽文件系统权限的方式去实现,而应使用FileProvider
请参考://www.greatytc.com/p/bec4497c2a63
  1. Sharepreference
SharedPreference 中只能存储简单数据类型(int、boolean、String 等),复杂数据类型建议使用文件、数据库等其他方式存储;
SharedPreference 最好封装一下,且所有Key应该统一管理维护,否则容易出现数据存取错乱,不好维护等现象;
SharedPreference 提 交 数 据 时 , 尽量使用 apply() , 而非commit(),原因:
-- apply 方法 进行提交会先写入内存,然后异步写入磁盘
-- commit 方法 是直接写入磁盘。
方法优缺点对比:
如果频繁操作SharedPreference时 ,apply 的性能会优于 commit;
如果希望立刻获取存储操作的结果,并根据结果做相应的其他操作时,应当使用 commit;

5.DB

-- 数据库 Cursor 必须确保使用完后关闭,以免内存泄漏;
-- 多线程操作写入数据库时,需要使用事务,以免出现同步问题,因为transaction 是一次原子操作,因此处于事务中的操作是线程安全的,
如果多线程不使用事务,容易造成数据库异常,提示数据库已被锁住。
-- 大数据写入数据库时,请使用事务或其他能够提高 I/O 效率的机制,保证执行速度;
-- 执行 SQL 语句时,应使用 SQLiteDatabase#insert()、update()、delete(),尽量少使用 SQLiteDatabase#execSQL(),以免 SQL 注入风险;


第一篇: 安卓编程技巧总结(1) 资源与UI布局处理

//www.greatytc.com/p/ff97b15d5c9d

第二篇: 安卓编程技巧总结(2) 基础组件开发

//www.greatytc.com/p/b05752377887

第三篇:安卓编程技巧总结(3) 进程与线程处理

//www.greatytc.com/p/7d05c8a368bd

第四篇:安卓编程技巧总结(4) 数据文件处理

//www.greatytc.com/p/0515df3b697d

第五篇:安卓编程技巧总结(5) 图片处理

//www.greatytc.com/p/76690b2ba310

第六篇:安卓编程技巧总结(6) APP安全分析

//www.greatytc.com/p/4347ff392122

第七篇:安卓编程技巧总结(7) 性能检测代码分析

//www.greatytc.com/p/687f3c641408

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容