一、存储的分类
Android的存储路径实际分类为
内部存储路径
内部缓存存储路径
外部存储路径
外部缓存存储路径
在有些手机上,系统也会在内部划出一个内部的SDCard路径和内部存储路径,所以当有SDCard的时候,就会有6个路径存在了
那么存储路径和缓存存储路径的区别就是:
1、缓存路径一般用于存放一些缓存数据,当程序删除的时候,缓存文件夹也会随之删除,避免了程序在卸载之后残留大量文件。
2、内部缓存路径和外部缓存路径也有所区别,当系统的内存空间紧张时,内部缓存路径下的文件会被删除,但是没有一个严格的标准保障,应该对这些缓存文件占用的最大存储空间设定个最大值,当实际超过这个值时,要对这些缓存文件做相应的清理工作 。但是系统不会观察外部缓存路径下是否超出大小,要自己去做文件清理机制。
3、内部缓存路径默认别的程序不能访问文件,所以一些私密的数据,别的他应用是访问不了的,如果需要运行系统或者其他应用访问,可以通过修改openFileOutput()下的int mode参数让别的应用也可以访问。
二、分析内部缓存和外部缓存的路径
内部的 /data/data/一般是看不到的,除非root
内部缓存路径
context.getCacheDir() 清除缓存
模拟器:内部缓存路径:/data/data/com.mocn.testin/cache/内部缓存路径.png
Nexus5:内部缓存路径:/data/user/0/com.mocn.testin/cache/内部缓存路径.png
this .getFilesDir()
模拟器:内部文件夹缓存路径:/data/data/com.mocn.testin/files/内部文件夹缓存路径.png
this .getDir( "文件夹名字" , Context. MODE_PRIVATE);
模拟器: 内部缓存路径新目录:/data/data/com.mocn.testin/app_文件夹名字/内部缓存路径新目录.png
this .getFileStreamPath ("下载" )
模拟器:下载:/data/data/com.mocn.testin/files/下载/下载.png
0 MODE_PRIVATE 为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下写入的内容会覆盖原文件的内容。
1 MODE_WORLD_READABLE 表示当前文件可以被其他应用读取。
2 MODE_WORLD_WRITEABLE 表示当前文件可以被其他应用写入。
3 MODE_MULTI_PROCESS SharedPreference的装载标记,设置它,文件将会在SharedPreference实例被装载到进程的时候检查是否被修改,主要用在一个应用有多个进程的情况。
清除数据会还原成最初的样子,所有的目录,sharepreferces,database文件等都会清空
外部缓存路径
context.getExternalCacheDir() 清除缓存
模拟器:外部缓存路径:/storage/emulated/0/Android/data/com.mocn.testin/cache/外部缓存路径.png
Nexus5:外部缓存路径:/storage/emulated/0/Android/data/com.mocn.testin/cache/外部缓存路径.png
context.getExternalFilesDir()
模拟器: 外部文件夹缓存路径:/storage/emulated/0/Android/data/com.mocn.testin/files/ssssss/外部文件夹缓存路径.png
三、外部存储和内部存储的路径
外部存储路径
Environment. getExternalStorageDirectory()
模拟器:/storage/emulated/0/外部存储路径.png
Nexus5:外部存储路径:/storage/emulated/0/外部存储路径.png
Environment.getExternalStoragePublicDirectory
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = newFile(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if(!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
returnfile;
}
在上面的代码中我们创建获得了存放picture的目录,并且新创建一个albumName文件。
如果你的api 版本低于8,那么不能使用getExternalStoragePublicDirectory(),而是使用Environment
.getExternalStorageDirectory(),他不带参数,也就不能自己创建一个目录,只是返回外部存储的根路径。
public File getAlbumStorageDir(Context context, String albumName) {
// Get the directory for the app's private pictures directory.
File file = newFile(context.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName);
if(!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
returnfile;
}
上面的代码创建了一个picture目录,并在这个目录下创建了一个名为albumName的文件,Environment.DIRECTORY_PICTURES其实就是字符串picture。
所有应用程序的外部存储的私有文件都放在根目录的Android/data/下,目录形式为/Android/data/<package_name>/
如果你的api 版本低于8,那么不能使用getExternalFilesDir(),而是使用Environment.getExternalStorageDirectory()获得根路径之后,自己再想办法操作/Android/data/<package_name>/下的文件。
也就是说api 8以下的版本在操作文件的时候没有专门为私有文件和公共文件的操作提供api支持。你只能先获取根目录,然后自行想办法。
在使用外部存储之前,你必须要先检查外部存储的当前状态,以判断是否可用。
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} elseif(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else{
// Something else is wrong. It may be one of many other states, but all we need
// to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
getFilesDir,getExternalFilesDir,getExternalStorageDirectory,getExternalStoragePublicDirectory区别:
Log.i("codecraeer", "getFilesDir = " + getFilesDir());
Log.i("codecraeer", "getExternalFilesDir = " + getExternalFilesDir("exter_test").getAbsolutePath());
Log.i("codecraeer", "getDownloadCacheDirectory = " + Environment.getDownloadCacheDirectory().getAbsolutePath());
Log.i("codecraeer", "getDataDirectory = " + Environment.getDataDirectory().getAbsolutePath());
Log.i("codecraeer", "getExternalStorageDirectory = " + Environment.getExternalStorageDirectory().getAbsolutePath());
Log.i("codecraeer", "getExternalStoragePublicDirectory = " + Environment.getExternalStoragePublicDirectory("pub_test"));
在log中看到如下结果:
(nexus 3)上是/storage/emulated/0,奇怪的是在有些手机上同样的代码却是下面的情况:
部存储根目录为/mnt/sdcard.
参考