Android本地存储路径学习

一、前言:

Android 中获取本地储存路径,有四个方法,
getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()。
接下来介绍下每个方法的特点以及路径地址

  • getCacheDir():/data/data/你的应用的包名/cache
  • getFilesDir():/data/data/你的应用的包名/files
  • getExternalFilesDir():SDCard/Android/data/你的应用的包名/files/
  • getExternalCacheDir():SDCard/Android/data/你的应用包名/cache/
  1. 从上文每个方法获取的路径中可以看出,getCacheDir()和getFilesDir()是获取手机自带的存储空间中的当前包文件的路径 ;
  2. getExternalFilesDir()和getExternalCacheDir()是获取手机中SD卡的存储控件中的当前包文件的路径。

使用外部存储记得加上访问权限:

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

二、路径解析:

1. getCacheDir()

该目录主要用于存放缓存文件,当系统的内存存储空间紧张时,该目录下的文件会被删除掉。关于这些文件究竟会在存储空间剩余多少的情况,没有严格的标准保障。
注意:你不应该依赖系统来清理这些缓存文件,你应该对这些缓存文件占用的最大存储空间设定个最大值,比如是1M,当实际占用空间超过这个值时,你应该对这些缓存文件做相应的清理工作(prune)。

返回的路径可能会改变随着时间的推移,所以应该保存相对路径相对路径。

2. getFilesDir()

  1. openFileOutput() 方法存储的路径,跟getFilesDir() 返回的路径是同一个路径,换句话说:getFilesDir(),是获取openFileOutput() 方法的存储路径。
    返回的路径可能会改变随着时间的推移,所以应该保存相对路径相对路径
  2. 不需要任何权限也可以访问
    目录中的文件,会在卸载你的应用程序时被删除掉

3. getExternalFilesDir()

存储在SD卡中,和getFilesDir()类似;
该方法路径下系统不一定会自动删除文件,所以需要手动设置使用的大小
getExternalFilesDir()路径不一定可用,因为,sd卡可能被卸载

4. getExternalCacheDir()

存储在SD卡中,和getCacheDir类似;
该方法路径下系统不一定会自动删除文件,所以需要手动设置使用的大小
getExternalCacheDir()路径不一定可用,因为,sd卡可能被卸载

public String getDiskCacheDir(Context context) {  
    String cachePath = null;  
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())  
            || !Environment.isExternalStorageRemovable()) {  
        cachePath = context.getExternalCacheDir().getPath();  
    } else {  
        cachePath = context.getCacheDir().getPath();  
    }  
    return cachePath;  
}  

三、代码解析:

1. 手机应用内置存储路径

  • getFilesDir().getAbsolutePath()
  • getFilesDir().getPath()
  • getCacheDir().getAbsolutePath()
  • getCacheDir().getPath()

实验代码:

String savePath5 = getFilesDir().getAbsolutePath();
String savePath6 = getFilesDir().getPath();

String savePath7 = getCacheDir().getAbsolutePath();
String savePath8 = getCacheDir().getPath();


Log.d(TAG,"save path5 --------->"+savePath5);
Log.d(TAG,"save path6 --------->"+savePath6);

Log.d(TAG,"save path7 --------->"+savePath7);
Log.d(TAG,"save path8 --------->"+savePath8);

打印结果:

tag:save path5 --------->/data/user/0/fxjzzyo.com.ffmpegtest/files
tag:save path6 --------->/data/user/0/fxjzzyo.com.ffmpegtest/files

tag: save path7 --------->/data/user/0/fxjzzyo.com.ffmpegtest/cache
tag: save path8 --------->/data/user/0/fxjzzyo.com.ffmpegtest/cache

结论:

  • getFilesDir()返回的是/data/user/0/包名/files这个文件夹,与应用的存在有关,当应用卸载时,里面的内容也同时被删除。
  • 同理,getCacheDir()返回的是/data/user/0/包名/cache这个文件夹,与应用的存在有关,当应用卸载时,里面的内容也同时被删除。
  • 另外,我这里的实验结果getAbsolutePath()和getPath()返回的路径是一样的,所以使用时不必纠结,我打算以后就用绝对路径getAbsolutePath()好了。

2. 手机外置sd卡存储路径(已过时,在AndroidX会报错)

有两种获取方式,一种是获取到sd卡根目录,另一种是获取到应用相关的sd卡目录。

2.1 获取sd卡根目录路径(已过时,在AndroidX会报错)

Environment.getExternalStorageDirectory().getAbsolutePath()

实验代码:

String savePath9 = Environment.getExternalStorageDirectory().getAbsolutePath();
String savePath10 = Environment.getExternalStorageDirectory().getPath();

Log.d(TAG,"save path9 --------->"+savePath9);
Log.d(TAG,"save path10 --------->"+savePath10);

打印结果:

tag: save path9 --------->/storage/emulated/0
tag: save path10 --------->/storage/emulated/0

结论:

Environment.getExternalStorageDirectory()获取的是sd卡的根目录文件夹,与应用无关,即使卸载了应用,里面的内容依然存在。

2.2 获取到应用相关的sd卡目录路径(已过时,在AndroidX会报错)

  • getExternalFilesDir(null).getAbsolutePath()

实验代码:

String savePath = getExternalFilesDir(null).getAbsolutePath();
String savePath2 = getExternalFilesDir(null).getPath();
String savePath3 = getExternalCacheDir().getAbsolutePath();
String savePath4 = getExternalCacheDir().getPath();

Log.d(TAG,"save path --------->"+savePath);
Log.d(TAG,"save path2 --------->"+savePath2);
Log.d(TAG,"save path3 --------->"+savePath3);
Log.d(TAG,"save path4 --------->"+savePath4);

打印结果:

tag: save path --------->/storage/emulated/0/Android/data/fxjzzyo.com.ffmpegtest/files
tag: save path2 --------->/storage/emulated/0/Android/data/fxjzzyo.com.ffmpegtest/files
tag: save path3 --------->/storage/emulated/0/Android/data/fxjzzyo.com.ffmpegtest/cache
tag: save path4 --------->/storage/emulated/0/Android/data/fxjzzyo.com.ffmpegtest/cache

结论:

  • getExternalFilesDir(null)获取的是/storage/emulated/0/Android/data/包名/files这个文件夹,与应用有关,卸载了应用,里面的内容也没了。
  • 同理,getExternalCacheDir()获取的是/storage/emulated/0/Android/data/包名/cache这个文件夹,与应用有关,卸载了应用,里面的内容也没了。

四、使用Android公共路径

//已经废弃,AndroidX会报错
String APP_ROOT_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ "/" +  BaseApplication.instance.getPackageName();
 //使用这个
String absolutePath = BaseApplication.instance.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
//传入值为空
String path2 = BaseApplication.instance.getExternalFilesDir(null).getAbsolutePath();

Log.d("LUO","===APP_ROOT_PATH: "+APP_ROOT_PATH);
Log.d("LUO","===absolutePath: "+absolutePath);
Log.d("LUO","===path2: "+path2);

LUO: ===APP_ROOT_PATH: /storage/emulated/0/Download/com.dotc.demo1
LUO: ===absolutePath: /storage/emulated/0/Android/data/com.dotc.demo1/files/Download
LUO: ===path2: /storage/emulated/0/Android/data/com.dotc.demo1/files

五、获取APP路径

1、getExternalFilesDir()和getFilesDir()

public String getFilesPath( Context context ){
    String filePath ;
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
            || !Environment.isExternalStorageRemovable()) {
        //外部存储可用
        filePath = context.getExternalFilesDir(null).getPath();
    }else {
        //外部存储不可用
        filePath = context.getFilesDir().getPath() ;
    }
    return filePath ;
}

函数返回路径/storage/emulated/0/Android/data/包名/files
用来存储一些长时间保留的数据,应用卸载会被删除

2、getExternalCacheDir和getCacheDir

public String getCachePath( Context context ){
        String cachePath ;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
                || !Environment.isExternalStorageRemovable()) {
            //外部存储可用
            cachePath = context.getExternalCacheDir().getPath() ;
        }else {
            //外部存储不可用
            cachePath = context.getCacheDir().getPath() ;
        }
        return cachePath ;
    }

函数返回路径/storage/emulated/0/Android/data/包名/cache
用来存储一些临时缓存数据

参考文章:
https://blog.csdn.net/xiao_sier/article/details/78667149

https://blog.csdn.net/fxjzzyo/article/details/84787968

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

推荐阅读更多精彩内容