Android的内外存储、SharedPreferences(偏好设置)及获取空间使用情况

一、Android的外部存储

          首先明确,不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。

外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储。

外部存储中的文件是可以被用户或者其他应用程序修改的,有两种类型的文件(或者目录):

1.公共文件Public files:文件是可以被自由访问,且文件的数据对其他应用或者用户来说都是有意义的,当应用被卸载之后,其卸载前创建的文件仍然保留。比如camera应用,生成的照片大家都能访问,而且camera不在了,照片仍然在。

如果你想在外存储上放公共文件你可以使用getExternalStoragePublicDirectory()。

如果你的api 版本低于8,那么不能使用getExternalStoragePublicDirectory(),而是使用Environment.getExternalStorageDirectory(),他不带参数,也就不能自己创建一个目录,只是返回外部存储的根路径。

2.私有文件Private files:其实由于是外部存储的原因即是是这种类型的文件也能被其他程序访问,只不过一个应用私有的文件对其他应用其实是没有访问价值的(恶意程序除外)。外部存储上,应用私有文件的价值在于卸载之后,这些文件也会被删除。类似于内部存储。

创建应用私有文件的方法是Context.getExternalFilesDir()

如果你的api 版本低于8,那么不能使用getExternalFilesDir(),而是使用Environment.getExternalStorageDirectory()获得根路径之后,自己再想办法操作/Android/data/<package_name>/下的文件。

也就是说api 8以下的版本在操作文件的时候没有专门为私有文件和公共文件的操作提供api支持。你只能先获取根目录,然后自行想办法。

外部存储的8个方法:

getExternalCacheDir()
        /sdcard/Android/data/应用/cache/

getExternalFilesDir(Environment.DIRECTORY_MUSIC)
        /sdcard/Android/data/应用/文件类型目录/

Environment.getExternalStorageDirectory()
        外部存储卡路径 File 对象
        “/sdcard/”
        “/mnt/sdcard/”
        “/storage/storage0/”

Environment.getExternalStoragePublicDirectory(文件类型)
        获得某种类型文件的标准存储目录,Environment.常量
        DIRECTORY_DOWNLOADS         下载
        DIRECTORY_ALARMS            闹铃
        DIRECTORY_DCIM              数码相机存储
        DIRECTORY_MOVIES            电影
        DIRECTORY_MUSIC             音乐
        DIRECTORY_NOTIFICATIONS     通知音
        DIRECTORY_PICTURES          图片
        DIRECTORY_PODCASTS          播客
        DIRECTORY_RINGTONES         铃声

Environment.getExternalStorageState()
        获得存储卡状态代码,Environment.常量
        MEDIA_BAD_REMOVAL           正确卸载前已经拔卡
        MEDIA_CHECKING              正在检测
        MEDIA_MOUNTED               正确装载,已准备好读写
        MEDIA_MOUNTED_READ_ONLY     正确装载,只读
        MEDIA_NOFS                  正确装载,但不支持文件系统
        MEDIA_REMOVED               已移除
        MEDIA_SHARED                已经卸载并作为u盘连接电脑
        MEDIA_UNMOUNTABLE           无法装载
        MEDIA_UNMOUNTED             存在sd卡,但未装载   

Environment.getRootDirectory()              /system

Environment.getDataDirectory()              /data

Environment.getDownloadCacheDirectory()     /cache

二、Android的内部存储

           注意内部存储不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。

内部存储 8个方法: 

  /data/data/应用包名

    getDir(String name, int mode)
        /data/data/应用/app_目录名
        创建或访问文目录,返回 File 对象
        在此目录可以创建任意文件、子目录
        访问权限针对整个目录而不能针对单个文件
        
    getFilesDir()
        /data/data/应用/files
        获得表示 files 目录的 File 对象
    
    getFileStreamPath(String name)
        /data/data/应用/files/文件名
        获得表示 files 目录中,一个指定文件的 File 对象,
        这些文件也可以通过以下方法创建流
            openFileInput()
            openFileOutput()

           
    openFileInput(String name)
    openFileOutput(String name, int mode)
        /data/data/应用/files/文件名
        创建文件流  
        MODE_PRIVATE
        MODE_APPEND
        MODE_WORLD_READABLE
        MODE_WORLD_WRITEABLE
    
    deleteFile(String name)
        /data/data/应用/files/文件名
        删除文件
    
    fileList()
        /data/data/应用/files/
        获得文件列表,返回文件名 String[] 数组
    
    getCacheDir()
        /data/data/应用/cache/
        获得缓存(临时)目录,返回表示该目录的 File 对象。
        存储空间紧张时,系统会自动删除该目录中的文件。
        你应该严格限制此目录总大小(例如1M),
        超出限制时应对文件做手动清理
    
    getDatabasePath(“数据库文件.db”)

三、获取空间使用情况

 * 内部存储 /data
    Environment.getDataDirectory()
 
  * 外部存储 /sdcard
    Environment.getExternalStorageDirectory()
    
  * StatFs
  ——————————————–
    创建实例
    ——————————-
      StatFs fs = new StatFs(File对象);
    
    方法
    ——————————-
      getBlockCount()       总块数
      getBlockSize()        块大小
      getAvailableBlocks()  有权访问的块数
      getFreeBlocks()       剩余的块数

四、偏好设置

 * 保存一些用户设置、用户的私人信息
  * 通常用来做选项设置
  * 保存为一个 xml 格式的文本文件
      
      /data/data/应用/shared_prefs/文件名.xml

    p1 = getSharedPreferences(文件名, MODE_PRIVATE);            
          
          自定义文件名           

    p2 = getPreferences(MODE_PRIVATE);

          Activity类名当做文件名
          在一个 Activity 中,读写自己的偏好设置文件

    p3 = PreferenceManager.getDefaultSharedPreferences(this);   
          
          包名当做文件名,
          在真个应用中,都可以使用这个偏好设置文件

    SharedPreferences 方法
    ————————————————–
        edit()
    
        contains(String key)
        getAll()
        getBoolean(String key, boolean defValue)
        getFloat(String key, float defValue)
        getInt(String key, int defValue)
        getLong(String key, long defValue)
        getString(String key, String defValue)
        getStringSet(String key, Set<String> defValues)
        registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener)
        unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener)

    SharedPreferences.Editor
    ————————————————–
        putBoolean(String key, boolean value)
        putFloat(String key, float value)
        putInt(String key, int value)
        putLong(String key, long value)
        putString(String key, String value)
        putStringSet(String key, Set<String> values)
        
        remove(String key)
        clear()
        
        apply()
        commit()

参考:http://blog.csdn.net/androidwifi/article/details/17725989

    原文作者:键盘上的钢琴师_v5
    原文地址: https://blog.csdn.net/daijin888888/article/details/51115328
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞