参考https://blog.csdn.net/nugongahou110/article/details/48154859
App独立文件
这类文件当我们删除应用之后,还应该保留在手机上的,例如拍照的照片,不应该随着删除应用而被删除掉。对于这类文件,Android给我们提供了特定的目录,这些目录都是以DIRECTORY开头的,例如:DIRECTORY_MUSIC , DIRECTORY_PICTURES.
这个sdCard的路径为mnt/sdcard/ 即为SD卡根路径,我们可以指定访问的文件夹名
方法一:
File sdCard = Environment.getExternalStorageDirectory();
File directory_pictures = new File(sdCard, "Pictures");
Log.i(TAG,"directory_pictures="+directory_pictures);
//log显示:directory_pictures=mnt/sdcard/Pictures
方法二:
File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Log.e(TAG, "directory_pictures="+directory_pictures);
//log显示:directory_pictures=mnt/sdcard/Pictures
App专属文件
这类文件应该是随着app删除而一起删除的,它们可以被存储在两个地方:internal storage 和 external storage 。
1.存储在internal storage
这是你app私有的目录,你的shared preference文件,数据库文件,都存储在这里。目录为data/data/< package name >/files/
访问方法为:
File filesDir = getFilesDir();
Log.i(TAG,"file_dir="+filesDir);
2.存储在external storage
这类文件不应该存在SD卡的根目录下,而应该存在mnt/sdcard/Android/data/< package name >/files/…这个目录下。
File externalFilesDir = getExternalFilesDir(null);
Log.i(TAG, "externalFileDir = "+externalFilesDir);
//log中的内容为null,因为要添加读取权限!
检测SD卡有没有安装:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//SD卡已装入
}
adb shell
C5_Plus:/ # ls
acct config default.prop init init.usb.rc proc storage vendor
bugreports custom dev init.environ.rc init.zygote32.rc root sys
cache d etc init.rc mnt sbin system
charger data fstab.enableswap init.usb.configfs.rc oem sdcard ueventd.rc
1:内部存储 内部存储中又包含RAM和ROM等部分
data文件夹就是我们常说的内部存储,当我们打开data文件夹之后(没有root的手机不能打开该文件夹)
data下还有许多文件夹:有
@btmtk app-asec cache dumpsys md3 misc_de property tee
adb app-ephemeral ccci_cfg duraspeed mdl mnl_flp resource-cache tombstones
aee_exp app-lib core gps_mnl media mnl_gfc ss user
agps_supl app-private dalvik-cache local mediadrm nfc_socket system user_de
anr backup data log_temp misc ota system_ce vendor
app bootchart drm lost+found misc_ce ota_package system_de
data/app下存放着我们所有安装的app的apk文件;
data/data下存放着各个apk的数据信息;
1.data/data/包名/shared_prefs
2.data/data/包名/databases
3.data/data/包名/files
4.data/data/包名/cache
我们在使用sharedPreferenced的时候,将数据持久化存储于本地,其实就是存在这个文件中的xml文件里,
我们App里边的数据库文件就存储于databases文件夹中,
还有我们的普通数据存储在files中,
缓存文件存储在cache文件夹中,
3和4路径获取的方式:通过当前Context获取得到 (因为获取的是当前应用的路径)
Log.d(TAG, "initView: getFilesDir=="+getFilesDir());
Log.d(TAG, "initView: getCacheDir=="+getCacheDir());
/data/data/包名/XX 的文件。开发中SQLite数据、SharedPreference数据均保存在这里,虽说我们可以读写操作,
但这部分空间由系统维护。
2:外部存储(内置存储卡)
C5_Plus:/storage/emulated/0 # ls
Alarms DCIM Movies Notifications Podcasts TouchPal_go
Android Download Music Pictures Ringtones mtklog
两部分:
/storage/emulated/0/Android/data/
与/storage/emulated/0/Android包的同级目录上,建立App包存储数据,
这两部分空间均由开发者维护。
区别:
/storage/emulated/0/Android/data/包名/下的数据为私有目录数据,会随App卸载被清除;
与/storage/emulated/0/Android包同级的数据属于公有目录数据,不会随App卸载被清除,这就会造成数据的卸载残留。
故Google官方建议开发者将App的数据存储在私有目录即/storage/emulated/0/Android/data/包名/下,这样卸载App时数据会随之被系统清除,不会造成数据残留。
内置存储卡:
共有数据目录: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
清除缓存:将外部私有数据下的cache包(/storage/emulated/0/Android/data/包名/cache)清除,将内部数据下的cache包下的内容
(/data/data/包名/cache/XXX)清除 。
清除数据:将外部私有数据包(/storage/emulated/0/Android/data/包名)清除,将内部数据下的所有内容(/data/data/包名/XXX)清除;
而两种操作对外部公有数据(与/storage/emulated/0/Android包同级的数据)均无影响。
总结:
内部数据:/data/data/包名/XXX 当前应用访问
外部私有数据:/storage/emulated/0/Android/data/包名/XXX 这种类型的文件也能被其他程序访问
外部公有数据:/storage/emulated/0/包名/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
绝对路径是指书写文件的完整路径,例如d:\java\Hello.java 但是使用绝对路径在表示文件时,受到的限制很大,且不能在不同的操作系统下运行,因为不同操作系统下绝对路径的表达形式存在不同。
相对路径是指书写文件的部分路径,例如\test\Hello.java
但是在安卓中,其实多数情况下我们都是使用的绝对路径。