安卓系统目录的获取

参考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
但是在安卓中,其实多数情况下我们都是使用的绝对路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值