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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。