Android 系统文件获取

Android 系统自身自带有存储,另外也可以通过 SD 卡来扩充存储空间。 前者空间较小,后者空间大,但后者不一定可用。 开发应用,处理本地数据存取时,可能会遇到这些问题:

1.需要判断 SD 卡是否可用: 占用过多机身内部存储,容易招致用户反感,优先将数据存放于 SD 卡;

2.应用数据存放路径,同其他应用应该保持一致,应用卸载时,清除数据:

    ①标新立异在 SD 卡根目录建一个目录,招致用户反感

    ②用户卸载应用后,残留目录或者数据在用户机器上,招致用户反感

3.需要判断两者的可用空间: SD 卡存在时,可用空间反而小于机身内部存储,这时应该选用机身存储;

4.数据安全性,本应用数据不愿意被其他应用读写;

5.图片缓存等,不应该被扫描加入到用户相册等媒体库中去。

存储路径

一般我们可以通过 Context 和 Environment 相关的方法获取文件存取的路径。

1.内部存储

1.1 根目录($rootDir):/data,通过 Environment.getDataDirectory() 获取。

1.2 应用程序目录($applicationDir):$rootDir/data/包名(不一定,不同设备可能不同)

应用缓存目录:$applicationDir/cache,通过Context.getCacheDir()获取。

应用文件目录:$applicationDir/files,通过Context.getFilesDir()获取。Context.getFileStreamPath(String name)返回以name为文件名的子文件目录,若name为空,则返回文件根目录。假设我们的应用程序包名为com.learn.test,路径如下:

Environment.getDataDirectory():      /data

Context.getCacheDir():              /data/data/com.learn.test/cache

Context.getFilesDir():              /data/data/com.learn.test/files

Context.getFileStreamPath(""):      /data/data/com.learn.test/files

Context.getFileStreamPath("test"):  /data/data/com.learn.test/files/test

2.外部存储

2.1 根目录($rootDir):/storage/emulated/0(不一定,不同设备可能不同),通过 Environment.getExternalStorageDirectory() 获取。

2.2 应用程序目录($applicationDir):$rootDir/Andorid/data/包名

应用缓存目录:$applicationDir/cache,通过Context.getExternalCacheDir()获取。

应用文件目录:$applicationDir/files,通过Context.getExternalFilesDir(String type),type为空字符串时获取。type系统给我们提供了很多常用的类型,比如图片和下载等等:

public static String DIRECTORY_MUSIC = "Music";

public static String DIRECTORY_ALARMS = "Alarms";

public static String DIRECTORY_NOTIFICATIONS = "Notifications";

public static String DIRECTORY_PICTURES = "Pictures";

public static String DIRECTORY_MOVIES = "Movies";

public static String DIRECTORY_DOWNLOADS = "Download";

public static String DIRECTORY_DCIM = "DCIM";

public static String DIRECTORY_DOCUMENTS = "Documents";


假设我们的应用程序包名为com.learn.test,路径如下:

Environment.getExternalStorageDirectory():              /storage/emulated/0

Context.getExternalCacheDir():                          /storage/emulated/0/Android/data/com.learn.test/cache

Context.getExternalFilesDir(""):                        /storage/emulated/0/Android/data/com.learn.test/files

Context.getExternalFilesDir("test"):                    /storage/emulated/0/Android/data/com.learn.test/files/test

Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES):    /storage/emulated/0/Android/data/com.learn.test/files/Pictures


2.3 公共存储目录: 我们可以在外部存储上新建任意文件夹,不过在6.0及之后的系统需要动态申请权限,这些目录的内容不会随着应用的卸载而消失。如:

Environment.getExternalStorageDirectory():                    /storage/emulated/0

Environment.getExternalStoragePublicDirectory(""):            /storage/emulated/0

Environment.getExternalStoragePublicDirectory("test"):        /storage/emulated/0/test

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES):  /storage/emulated/0/Pi


getExternalStorageDirectory()和getExternalFilesDir()的区别

App专属文件:app专属文件就是那些只有该app才可以使用的文件,这类文件随app的删除而删除,他们可以被存储两个地方:internal storage和external storage;internal storage就是手机上自带很小的一块区域,所以要正确实用;external storage就是SD卡,SD卡可能被卸下,所以SD卡不是任何时间都可以,因此我们必须降一些重要的数据文件以及一些配置文件放在internal storage中。将一些大的图片或文件放到external storage中。

存储在internal storage:这是你app私有的目录,你的shared preference文件数据库文件都在这里。目录为"data/data//file/.."   访问方法为: File fdir=gerFilesDir();

存储在external storage:这类文件存在在"mnt/sdacard/Android/data//file/.."目录下。随app的删除而删除。

获取这个路径的方法:File eFile=getExternalFilesDir(null);

添加文件权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

getExternalFilesDir(null)参数传入的为null,这样默认访问的是files文件夹,可以指定子文件夹。

有些时候我们的手机没有安装SD卡,所以我们使用前需要判断一下:

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//SD卡已装入}

App独立文件:app独立文件就是那些不依赖某些特定app的文件,这类文件当我们删除应用之后,还应该保留在手机上的。

访问方式:

(1)File sdCard=Environment.getExternalStorageDirectory();这个路径为sd卡的根路径mnt/sdcard

(2)File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

作者:CrazyLeeY

链接:https://www.jianshu.com/p/e7ad02d6b445

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

推荐阅读更多精彩内容