作为一个开发者,我们经常需要通过缓存一些文件到SD卡中,常见的方式就是,通过:

File sdCard = Environment.getExternalStorageDirectory();

获取SD卡根目录,然后自定义文件/文件名进行文件存储.这样做法的结果就是,当手机安装了大量的app时,

SD卡根目录会迅速变得杂乱不堪。并且在API 6.0之后,根目录文件存储是需要用户授权的,就算你在

AndroidManifest.xml中配置了存储权限,用户不授权也是写不进去了.

SD卡读写权限:

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

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

其实,Google已经提供了最佳的外部存储方案,那就是统一路径为:

/Android/data/< package name >/files/… (该路径通常挂载在/mnt/sdcard/下)

外部存储路径调用方法是:context.getExternalFilesDir(dir).getAbsolutePath() //通过context调用,

参数dir为自自定义文件夹.

这个方法获得的文件存储路径适用于6.0以后系统,主要AndroidManifest.xml配置读写权限了,

就不需要用户再授权了.

以上,是关于外部存储的介绍,那么如果有些手机没有SD卡或者系统自身没有分配外部存储空间,时,

我们应该怎么缓存数据呢?

那就需要用到内部存储了,内部存储的路径是: /data/data/< package name >/files/…

(该路径挂载在在手机自身存储目录)

内部存储路径调用方法是:context().getCacheDir().getAbsolutePath() //通过context调用

因此,正常开发中获取存储路径的方法是:

/**
*
* @param context 上下文对象
* @param dir 存储目录
* @return
*/
public static String getFilePath(Context context,String dir) {
String directoryPath="";
//判断SD卡是否可用
if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {
directoryPath =context.getExternalFilesDir(dir).getAbsolutePath() ;
// directoryPath =context.getExternalCacheDir().getAbsolutePath() ;
}else{
//没内存卡就存机身内存
directoryPath=context.getFilesDir()+File.separator+dir;
// directoryPath=context.getCacheDir()+File.separator+dir;
}
File file = new File(directoryPath);
if(!file.exists()){//判断文件目录是否存在
file.mkdirs();
}
LogUtil.i("filePath====>"+directoryPath);
return directoryPath;
}

其中,getExternalCacheDir()与getCacheDir()的区别 与getExternalFilesDir()及getFilesDir()的区别相同,

前者只是在路径下自动建好了一个cach文件目录:/data/< package name >/files/cach/...

存储区别简明示意图如下:

本文转自:https://blog.csdn.net/losefrank/article/details/53464646

转:Android文件存储路径getFilesDir()与getExternalFilesDir的区别的更多相关文章

  1. Android 文件存储浅析

    最近做的一个需求和文件存储有关系.由于之前没有系统梳理过,对文件存储方面的知识一直很懵懂.趁着周末有时间,赶紧梳理一波. 这首从网上找到的一张图,很好的概括了外部存储和内部存储. 下面我们再来具体介绍 ...

  2. unity中的文件存储路径与各平台(Android,iOS)的关系

    原文链接:unity中的文件存储路径与各平台(Android,iOS)的关系 主要是这个问题困扰我了一阵子,所以特写写... unity中的的各种存储方法的对应关系(直接上截图吧) 重点说的是Appl ...

  3. 截取linux文件存储路径方法

    1.截取linux文件存储路径方法 package com.tydic.eshop.action.freemarker; public class dddd { public static void ...

  4. 修改Jupyter Notebook默认文件存储路径(已安装Anaconda)

    https://blog.csdn.net/weixin_44799144/article/details/91823079 修改Jupyter Notebook默认文件存储路径首先,安装好Anaco ...

  5. 【HANA系列】SAP HANA的ini文件存储路径

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA的ini文件存储 ...

  6. 安卓各文件存储路径汇总(Android file path)

    写下来,省得以后不记得到处翻: Environment.getDataDirectory() = /data Environment.getDownloadCacheDirectory() = /ca ...

  7. Android文件存储使用参考

    可能遇到的问题 android系统自身自带有存储,另外也可以通过sd卡来扩充存储空间.前者好比pc中的硬盘,后者好移动硬盘. 前者空间较小,后者空间大,但后者不一定可用. 开发应用,处理本地数据存取时 ...

  8. Android 文件存放路径【转】

    对于应用携带的静态数据,可以放置在应用的assets目录或者res,raw目录下.对于assets目录下的静态数据,存在当文件最大支持1MB的局限,读取方式如下: 1 InputStream is = ...

  9. android 文件存储&SharedPreferences

    一.文件存储 文件存储主要是I/O流的操作,没什么好说的,需要注意的是保存文件的各个目录. 下面为常用的目录: public static File getInFileDir(Context cont ...

随机推荐

  1. JUC-Condition和Lock实践-线程按序交替执行

    编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A.B.C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示.如:ABCABCABC…… 依次递归 这里只使用c ...

  2. zuul(springboot)设置静态资源代理和默认首页代码一例

    直接上代码: public class StaticResourcesConfig extends WebMvcConfigurerAdapter { private static final Log ...

  3. openssh基于源码编译覆盖式安装

    覆盖式,就是卸载旧的openssh,打扫干净屋子再请客... 注意:请做做好测试工作 00.查看本机已安装的openssh rpm –qa |grep openssh rpm -e openssh-s ...

  4. Ubuntu x86-64汇编(4) 数值操作指令

    整数乘法指令 Integer Multiplication 对于有符号数的乘法有特殊的规则, 因此无符号数乘法和有符号数乘法对应着不同的指令mul和imul. 乘法会产生两倍尺寸的数值结果, 即两个n ...

  5. Linux命令行监控网口流量

    1.ifconfig [网卡名] ifconfig eth0 . 2. /proc/net/dev cat /proc/net/dev . 3. 使用watch命令配合 ifconfig, cat / ...

  6. 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)

    一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...

  7. timerTask任务定时器

      简单的一个定时器,异步任务 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void ru ...

  8. Ubuntu 下用命令行快速打开html,mp3等文件

    想用命令行打开网页文件,实现方法如下: 1.Ctrl+Alt+T可以打开shell,F11可以全屏显示,输入以下命令即可打开js17.html,并且指定浏览器,比如指定chrome, google-c ...

  9. openstack neutron 二/三层网络实现

    引用声明:https://zhangchenchen.github.io/2017/02/12/neutron-layer2-3-realization-discovry/ 一.概述 Neutron是 ...

  10. 【HTML】如何判断当前浏览器是否是IE

    HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...