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

http://blog.csdn.net/wenqiaoqqq/article/details/55193264

一直对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两个类中,我们可以如下

[java]  view plain  copy
  1. public class MainActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.           
  8.         Log.i("wenqiao""Environment.getDataDirectory():" + Environment.getDataDirectory().getAbsolutePath());  
  9.         Log.i("wenqiao""Environment.getExternalStorageDirectory():" + Environment.getExternalStorageDirectory().getAbsolutePath());  
  10.         Log.i("wenqiao""Environment.getRootDirectory():" + Environment.getRootDirectory().getAbsolutePath());  
  11.         Log.i("wenqiao""Environment.getDownloadCacheDirectory():" + Environment.getDownloadCacheDirectory().getAbsolutePath());  
  12.         /** 
  13.          * 这个方法接收一个参数,表明目录所放的文件的类型,传入的参数是Environment类中的DIRECTORY_XXX静态变量,比如DIRECTORY_DCIM等. 
  14.          * 注意:传入的类型参数不能是null,返回的目录路径有可能不存在,所以必须在使用之前确认一下,比如使用File.mkdirs创建该路径。 
  15.          */  
  16.         File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS);  
  17.         if( !path.exists() ){  
  18.             path.mkdirs();  
  19.         }  
  20.         /* /storage/emulated/0/Alarms */  
  21.         Log.i("wenqiao""Environment.getExternalStoragePublicDirectory():" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS));  
  22.           
  23.         /** 
  24.          * contextWrapper 
  25.          */  
  26.         Log.i("wenqiao""getCacheDir():" + this.getCacheDir().getAbsolutePath());  
  27.         Log.i("wenqiao""getFilesDir():" + this.getFilesDir().getAbsolutePath());  
  28.         Log.i("wenqiao""getExternalCacheDir():" + this.getExternalCacheDir().getAbsolutePath());  
  29.         Log.i("wenqiao""getExternalFilesDir():" + this.getExternalFilesDir(Environment.DIRECTORY_DCIM).getAbsolutePath());  
  30.         Log.i("wenqiao""getPackageResourcePath():" + this.getPackageResourcePath());  
  31.         Log.i("wenqiao""getDir():" + this.getDir("myfile", Context.MODE_PRIVATE));  
  32.           
  33.     }  
  34.   
  35. }  
    在华为荣耀6上测试结果:

[java]  view plain  copy
  1. 02-15 15:28:24.154: I/wenqiao(12821): Environment.getDataDirectory():/data  
  2. 02-15 15:28:24.157: I/wenqiao(12821): Environment.getExternalStorageDirectory():/storage/emulated/0  
  3. 02-15 15:28:24.157: I/wenqiao(12821): Environment.getRootDirectory():/system  
  4. 02-15 15:28:24.157: I/wenqiao(12821): Environment.getDownloadCacheDirectory():/cache  
  5. 02-15 15:28:24.168: I/wenqiao(12821): Environment.getExternalStoragePublicDirectory():/storage/emulated/0/Alarms  
  6. 02-15 15:28:24.168: I/wenqiao(12821): getCacheDir():/data/user/0/com.jaya.storagedemo/cache  
  7. 02-15 15:28:24.170: I/wenqiao(12821): getFilesDir():/data/user/0/com.jaya.storagedemo/files  
  8. 02-15 15:28:24.172: I/wenqiao(12821): getExternalCacheDir():/storage/emulated/0/Android/data/com.jaya.storagedemo/cache  
  9. 02-15 15:28:24.175: I/wenqiao(12821): getExternalFilesDir():/storage/emulated/0/Android/data/com.jaya.storagedemo/files/DCIM  
  10. 02-15 15:28:24.175: I/wenqiao(12821): getPackageResourcePath():/data/app/com.jaya.storagedemo-2/base.apk  
  11. 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时,如果文件不存在,系统会创建文件。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值