android进阶4step1:android小知识 文件存储

文件存储

作为一个开发者,我们经常需要通过缓存一些文件到 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 这时提供了最佳的外部存储方案,就是统一路径为:

context.getExternalFilesDir(dir).getAbsolutePath()

//通过 context 调用,参数 dir 为自定义文件夹.

这个方法获得的文件存储路径适用于 6.0 以后的系统只要 AndroidManifest.xml 配置读写权限了,不需要用户再授权了
通过 Context.getExternalFilesDir()方法获取到 SDCard/Android/data/< package name >/files/,通常存放需要长时间保存的数据,而通过 Context.getExternalCacheDir() 方法获取到的 SDCard/Android/data/< package name >/cache/,通常存放需要临时缓存的数据。

如果是使用了上述目录,那么当应用被卸载时这个目录下的所有文件都会被删除,即不会留下任何垃圾信息,并且上述二个目录分别对应“设置”->“应用”->应用详情里 面的“清除数据”与“清除缓存”选项。

2、内部存储

以上,是关于外部存储的介绍,那么如果有些手机没有 SD 卡或者系统自身没有分配外部存储空间时,我们应该怎么缓存数据呢?那就需要用到内部存储了,内部存储的路径是:

/data/data/< package name >/files/...(该路径挂载在在手机自身存储目录) 内部存储路径调用方法是:

context().getCacheDir().getAbsolutePath() 

//通过 context 调用 因此,很多开发中获取存储路径的方法是:

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(); 
}

return directoryPath; }

其中 getExternalCacheDir()与 getCacheDir()的区别。就像 getExternalFilesDir()及 getFilesDir()的区别相同,前者只是在路径下自动建好了一个 cach 文件目录: /data/< package name >/files/cach/...

2、存储示意图 

external storage 外部存储

Environment.getExternalStorageDirectory()

SD 根目录:/mnt/sdcard/ (6.0 后写入需要用户授权)

context.getExternalFilesDir(dir)

/mnt/sdcard/Android/data/< package name >/files/...

context.getExternalCacheDir()

/mnt/sdcard/Android/data/< package name >/cache/...

internal storage 内部存储

context.getFilesDir()

/data/data/< package name >/files/...

context.getCacheDir()

/data/data/< package name >/cache/...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值