1:内部存储
data文件夹就是我们常说的内部存储,当我们打开data文件夹之后(没有root的手机不能打开该文件夹)
data下还有许多文件夹
一个文件夹是app文件夹,app文件夹里存放着我们所有安装的app 的apk文件
还有一个文件夹就是data文件夹,这个里面装的就是应用的数据信息
1.data/data/包名/shared_prefs
2.data/data/包名/databases
3.data/data/包名/files
4.data/data/包名/cache
3 4路径获取的方式:通过当前Context获取得到 (因为获取的是当前应用的路径)
Log.d(TAG, "initView: getCacheDir=="+getCacheDir()); Log.d(TAG, "initView: getFilesDir=="+getFilesDir());
2:外部存储
整个存储空间分为内部存储和外部存储两部分,内部存储中又包含RAM和ROM等部分。
一是根目录下路径为 /data/data/包名/XX 的文件。开发中SQLite数据、SharedPreference数据均保存在这里,虽说我们可以读写操作,
但这部分空间由系统维护。
三是在内置存储卡中做存储。在/storage/emulated/0/Android/data包下或与/storage/emulated/0/Android包同级目录上,建立App包存储数据,
这部分空间均由开发者维护。区别在于/storage/emulated/0/Android/data包下的数据为私有目录数据,会随App卸载被清除,
与/storage/emulated/0/Android包同级的数据(如系统目录DCIM包,DOWNLOWN包和bluetooth包,还有下图中的baidu包)属于公有目录数据,
不会随App卸载被清除,这就会造成数据的卸载残留。
Google官方建议开发者将App的数据存储在私有目录即/storage/emulated/0/Android/data包下,这样卸载App时数据会随之被系统清除,不会造成数据残留。
data/data/包名/shared_prefs
data/data/包名/databases
data/data/包名/files context.getFilesDir()
data/data/包名/cache context.getcacheDir()
内置存储卡:
共有数据目录:Environment.getExternalStoragePublicDirectory(String type) 共有目录不同的就是和apk没有关系
不会因为apk的卸载而将数据清除掉 所以一般不建议将数据存储在这个目录下面。
私有数据目录:返回的是相对应包名下的数据 会因为apk的卸载而数据被清除。
context.getExternalFilesDir(String type) /storage/emulated/0/Android/data/files
context.getEXternalCacheDir() /storage/emulated/0/Android/data/cache
内部数据:/data/data/包名/XXX
外部私有数据:/storage/emulated/0/Android/data/包名/XXX
外部公有数据:/storage/emulated/0/包名/XXX
清除缓存:将外部私有数据下的cache包(/storage/emulated/0/Android/data/包名/cache)清除,将内部数据下的cache包下的内容
(/data/data/包名/cache/XXX)清除 。
清楚数据:将外部私有数据包(/storage/emulated/0/Android/data/包名)清除,将内部数据下的所有内容(/data/data/包名/XXX)清除;
而两种操作对外部公有数据均无影响。
总结一句话 清除缓存就是清除cache数据 清除数据就是清除所有内存外存自己报名下的数据 也就是Environment获取的存储空间
数据不可以被清除
android中常用的文件操作相关api:
1:Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 判断是否存在外部存储器
2:String dateDirectory=Environment.getDataDirectory().getAbsolutePath();
返回的就是date根目录:/data
3:String downloadcache=Environment.getDownloadCacheDirectory().getAbsolutePath();
返回的就是cache缓存目录:/cache
4:String externalStorage=Environment.getExternalStorageDirectory().getAbsolutePath();
返回的就是外部存储器的目录:/storage/emulated/0
5:String rootStorage=Environment.getRootDirectory().getAbsolutePath();
返回的就是system根目录:/system
6:String externalcachePath=this.getExternalCacheDir().getPath();
返回/storage/emulated/0/Android/data/com.example.lining.mydemo/cache
7:String filedir=this.getFilesDir().getPath();
返回/data/data/com.example.lining.mydemo/files
8:String cacheDir=this.getCacheDir().getPath();
返回/data/data/com.example.lining.mydemo/cache
2:
绝对路径是指书写文件的完整路径,例如d:\java\Hello.java 但是使用绝对路径在表示文件时,受到的限制很大,且不能在不同的操作系统下运行,因为不同操作系统下绝对路径的表达形式存在不同。
相对路径是指书写文件的部分路径,例如\test\Hello.java
但是在安卓中,其实多数情况下我们都是使用的绝对路径。为什么呢?注意上面说到相对路径是以当前项目所在路径为当前路径,但在安卓中我们是不可能在项目所在路径目录下做任何操作的
3:手机内部外部存储详解
所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。
外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储
更为详细的目录详解:
adb shell
ls 看到的data文件夹就是我们常说的内部存储
在data文件下有app和data两个关键的文件夹:
app:一个文件夹是app文件夹,还有一个文件夹就是data文件夹,app文件夹里存放着我们所有安装的app的apk文件,其实,当我们调试一个app的时候,可以看到控制台输出的内容,有一项是uploading .....就是上传我们的apk到这个文件夹,上传成功之后才开始安装。
data:另一个重要的文件夹就是data文件夹了,这个文件夹里边都是一些包名,打开这些包名之后我们会看到这样的一些文件:
1.data/data/包名/shared_prefs
2.data/data/包名/databases
3.data/data/包名/files
4.data/data/包名/cache
如果打开过data文件,应该都知道这些文件夹是干什么用的,
我们在使用sharedPreferenced的时候,将数据持久化存储于本地,其实就是存在这个文件中的xml文件里,
我们App里边的数据库文件就存储于databases文件夹中,
还有我们的普通数据存储在files中,
缓存文件存储在cache文件夹中,
存储在这里的文件我们都称之为内部存储。
4:外部存储: 外部存储一般就是我们上面看到的storage文件夹,当然也有可能是mnt文件夹,这个不同厂家有可能不一样。
一般来说,在storage文件夹中有一个sdcard文件夹,这个文件夹中的文件又分为两类,一类是公有目录,还有一类是私有目录,其中的公有目录有九大类,比如DCIM、DOWNLOAD等这种系统为我们创建的文件夹,私有目录就是Android这个文件夹,这个文件夹打开之后里边有一个data文件夹,打开这个data文件夹,里边有许多包名组成的文件夹。
5:操作存储空间
首先,经过上面的分析,大家已经明白了,什么是内部存储,什么是外部存储,以及这两种存储方式分别存储在什么位置,一般来说,我们不会自己去操作内部存储空间,没有root权限的话,我们也没法操作内部存储空间,事实上内部存储主要是由系统来维护的。不过在代码中我们是可以访问到这个文件夹的。由于内部存储空间有限,在开发中我们一般都是操作外部存储空间,Google官方建议我们App的数据应该存储在外部存储的私有目录中该App的包名下,这样当用户卸载掉App之后,相关的数据会一并删除,如果你直接在/storage/sdcard目录下创建了一个应用的文件夹,那么当你删除应用的时候,这个文件夹就不会被删除。
1:缓存数据到本地的demo
String fileName="myfile";
String string= "helloworld8888899999888899988899988999776655fhgyjjkkkkj";
FileOutputStream fileOutputStream;
try{
Toast.makeText(context,"哈哈哈哈",Toast.LENGTH_SHORT).show();
fileOutputStream=openFileOutput(fileName, Context.MODE_PRIVATE);
fileOutputStream.write(string.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
}catch (Exception e){
Log.e("Exception===",e.toString());
}
}
});
String fileName="myfile";
String string= "1jjkkkkj";
File file=new File(context.getFilesDir(),fileName);
Log.e("file==",file.getPath());
try {
Toast.makeText(context,"哈哈哈哈",Toast.LENGTH_SHORT).show();
FileOutputStream fileOutputStream=new FileOutputStream(file);
fileOutputStream.write(string.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
内部存储的其他一些操作:
A.列出所有的已创建的文件,这个可能不容易想到,Context居然有这样的方法。
String[] files = Context.fileList();
for(String file : files) {
Log.e(TAG, "file is "+ file);
}
B.删除文件,能创建就要能够删除,当然也会提供了删除文件的接口,它也非常简单,只需要提供文件名
if(Context.deleteFile(filename)) {
Log.e(TAG, "delete file "+ filename + " sucessfully“);
} else {
Log.e(TAG, "failed to deletefile " + filename);
}
C.创建一个目录,需要传入目录名称,它返回 一个文件对象用到操作路径
File workDir = Context.getDir(dirName, Context.MODE_PRIVATE);
Log.e(TAG, "workdir "+ workDir.getAbsolutePath();
4:外部存储详解:
分为公共文件和私有文件
1:公共文件:公共文件Public files:文件是可以被自由访问,且文件的数据对其他应用或者用户来说都是由意义的,当应用被卸载之后,
其卸载前创建的文件仍然保 留。比如camera应用,生成的照片大家都能访问,而且camera不在了,照片仍然在。
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(),他不带参数,也就不能自己创建一个目录,只是返回外部存储的根路径。
2:私有文件:私有文件Private files:其实由于是外部存储的原因即是是这种类型的文件也能被其他程序访问,只不过一个应用私有的文件对
其他应用其实是没有访问价值的(恶意程序除外)。外部存储上,应用私有文件的价值在于卸载之后,这些文件也会被删除。类似于内部存储。
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;
}
在使用外部存储之前,你必须要先检查外部存储的当前状态,以判断是否可用。
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;
}
盒子里面apk下载路径:
1:mnt/sdcard/ 随后就是我们的创建文件的名称
下载图片的路径也是在mnt/sdcard/Download/jpg目录下面
context获取相关路径 一般数据直接放到apk的私有目录下面 这个卸载apk不会导致数据残留
Environment方式获取路径 可以获取系统的公共目录 一般不建议这样做。