android 应用存储路径和目录小结

    一直对android系统各种的存储路径理的不是很清晰,只知道有手机内部存储和外部存储(一般为sd卡存储),今天把获取存储路径的API使用和区别详细看了一遍,在这里做个小结。

    从android 1.0系统开始,往sd卡的写入操作需要在清单文件添加WRITE_EXTERNAL_STORAGE权限。

    从android 4.1系统开始,读取sd的操作需要在清单文件添加WRITE_EXTERNAL_STORAGE权限。

    从android 4.4系统开始,应用可以管理在它外部存储上的特定包名目录,且不需要添加读写权限。外部存储上有一个Android文件夹,在其data目录下一组文件夹,分别是各个应用的包名。context.getExternalCacheDir()和context.getExternalFilesDir(String type)两个方法分别可以获取对应包名下的cache和files文件目录,getExternalFilesDir方法中需传入一个文件夹类型,当type为Environment.DIRECTORY_DCIM,则会在files目录下创建一个DCIM文件夹,传入其他参数会生成对应的文件夹。

    举个栗子,对包名为com.jaya.storagedemo的应用,getExternalCacheDir获取到的存储目录:/storage/emulated/0/Android/data/com.jaya.storagedemo/cache,getExternalFilesDir(Environment.DIRECTORY_DCIM)获取到的目录:/storage/emulated/0/Android/data/com.jaya.storagedemo/files/DCIM。

    当我们在开发中想在本地缓存文件时,可以保存在sd卡上的Android/data/包名/,这样的好处一是可以充分利用sd卡的存储空间,只要不超过sd卡存储大小即可,另外当我们卸载应用时Android/data下包名对应的文件夹会被系统删除。当然如果是重要的私密文件还是保存在手机内部存储中更为安全。

    获取存储路径的方法主要在Environment和Context两个类中,我们可以如下

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Log.i("wenqiao", "Environment.getDataDirectory():" + Environment.getDataDirectory().getAbsolutePath());
        Log.i("wenqiao", "Environment.getExternalStorageDirectory():" + Environment.getExternalStorageDirectory().getAbsolutePath());
        Log.i("wenqiao", "Environment.getRootDirectory():" + Environment.getRootDirectory().getAbsolutePath());
        Log.i("wenqiao", "Environment.getDownloadCacheDirectory():" + Environment.getDownloadCacheDirectory().getAbsolutePath());
        /**
         * 这个方法接收一个参数,表明目录所放的文件的类型,传入的参数是Environment类中的DIRECTORY_XXX静态变量,比如DIRECTORY_DCIM等.
         * 注意:传入的类型参数不能是null,返回的目录路径有可能不存在,所以必须在使用之前确认一下,比如使用File.mkdirs创建该路径。
         */
        File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS);
        if( !path.exists() ){
        	path.mkdirs();
        }
        /* /storage/emulated/0/Alarms */
        Log.i("wenqiao", "Environment.getExternalStoragePublicDirectory():" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS));
        
        /**
         * contextWrapper
         */
        Log.i("wenqiao", "getCacheDir():" + this.getCacheDir().getAbsolutePath());
        Log.i("wenqiao", "getFilesDir():" + this.getFilesDir().getAbsolutePath());
        Log.i("wenqiao", "getExternalCacheDir():" + this.getExternalCacheDir().getAbsolutePath());
        Log.i("wenqiao", "getExternalFilesDir():" + this.getExternalFilesDir(Environment.DIRECTORY_DCIM).getAbsolutePath());
        Log.i("wenqiao", "getPackageResourcePath():" + this.getPackageResourcePath());
        Log.i("wenqiao", "getDir():" + this.getDir("myfile", Context.MODE_PRIVATE));
        
    }

}
    在华为荣耀6上测试结果:

02-15 15:28:24.154: I/wenqiao(12821): Environment.getDataDirectory():/data
02-15 15:28:24.157: I/wenqiao(12821): Environment.getExternalStorageDirectory():/storage/emulated/0
02-15 15:28:24.157: I/wenqiao(12821): Environment.getRootDirectory():/system
02-15 15:28:24.157: I/wenqiao(12821): Environment.getDownloadCacheDirectory():/cache
02-15 15:28:24.168: I/wenqiao(12821): Environment.getExternalStoragePublicDirectory():/storage/emulated/0/Alarms
02-15 15:28:24.168: I/wenqiao(12821): getCacheDir():/data/user/0/com.jaya.storagedemo/cache
02-15 15:28:24.170: I/wenqiao(12821): getFilesDir():/data/user/0/com.jaya.storagedemo/files
02-15 15:28:24.172: I/wenqiao(12821): getExternalCacheDir():/storage/emulated/0/Android/data/com.jaya.storagedemo/cache
02-15 15:28:24.175: I/wenqiao(12821): getExternalFilesDir():/storage/emulated/0/Android/data/com.jaya.storagedemo/files/DCIM
02-15 15:28:24.175: I/wenqiao(12821): getPackageResourcePath():/data/app/com.jaya.storagedemo-2/base.apk
02-15 15:28:24.175: I/wenqiao(12821): getDir():/data/user/0/com.jaya.storagedemo/app_myfile

    其中,/data/user/0目录其实就是/data/data目录,可以看出,getCacheDir和getFilesDir获取的是手机内部存储中应用包名下的cache和files文件夹,getDir则获取应用包名的文件夹,其中传入的是要获取的文件夹名。

    此外,context还可以通过openFileInput(name)和openFileOutput(name, mode)获取FileInputStream和FileOutputStream,分别对应的是/data/user/0/包名/files/下的文件输入流和输出流。name是文件名,mode指定打开文件的模式,有以下几种:

    Context.MODE_PRIVATE                                         默认模式,表示文件只能被自身应用访问,如果向文件中写入数据,会覆盖之前数据

    Context.MODE_MODE_APPEND                          文件写入时,文件不存在则创建文件,存在则在已有的内容上追加

    Context.MODE_MODE_WORLD_READABLE   表示文件可以被其他应用读取

    Context.MODE_WORLD_WRITEABLE                表示文件可以被其他文件写入

当调用openFileOutput时,如果文件不存在,系统会创建文件。


   

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android内部路径和外部存储路径区别在于其访问权限和存储位置。 Android的内部路径是指应用程序在设备的内部存储空间中创建的路径。这个路径只能被应用程序本身访问,其他应用程序、用户或系统都无法直接访问。内部路径通常用于存储应用程序的私密数据,如缓存文件、数据库文件等。由于内部路径只能被应用程序访问,所以应用程序对其具有读写权限,并且可以在应用程序卸载时将内部路径下的数据一并删除。 而外部存储路径则是指设备上的可移动存储介质,如SD卡。这个路径是被所有应用程序以及使用设备的用户和系统共享的,因此外部存储路径的数据可以被多个应用程序共享和访问。外部存储路径通常用于存储大量的公共数据,如音频、视频、图片等。由于外部存储路径是共享的,所以应用程序对其只具有读写权限,并且应用程序卸载时不会删除外部存储路径下的数据。 需要注意的是,由于外部存储路径是被所有应用程序共享的,所以访问外部存储路径需要申请相关的权限,并且需要注意防止数据被其他应用程序非法访问或篡改。在使用外部存储路径时,还需要进行容量检测,以确保设备上有足够的可用存储空间。 综上所述,Android的内部路径和外部存储路径在访问权限、存储位置和数据共享等方面存在区别。根据应用程序的需求和数据的性质,开发者可以选择合适的路径存储和管理数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值