Android开发的过程中。经常会涉及到存储,之前一直没有一个整体的概念,这篇文章就是进行一个知识点的梳理。

Android的存储有:内部存储、外部存储。

想要了解这两个概念,我们先将开发软件中的DDMS打开,看File Explorer,如下:

1、内部存储

上边的data文件夹,就是内部存储。data文件夹中有两个重要的文件夹app、data。
  app文件夹存放着我们所有已安装的软件的apk文件。
  data文件夹存放以包名命名的文件夹。每个文件夹里是:
    /data/data/包名/shared_prefs
    /data/data/包名/databases
    /data/data/包名/files
    /data/data/包名/cache
  这四个文件夹,其中SharePreferenced的数据就是存在shared_prefs中。软件中的数据库文件就是存在databases中,普通文件存在files中,缓存存在cache中。

在内部存储中的数据,当相关的软件删除时,会被同时删除。

2、外部存储

图中的mnt文件夹就是外部存储,不同的手机生产厂商对应的文件夹还可能是storage文件夹。在storage文件夹中还有一个文件夹sdcard。这个就是我们平时调用获取外部存储api时获取文件夹。在这个文件夹中公有目录和私有目录。公有目录有九大类。私有目录只有Android这一个,里边也是以包名为目录的。

  在很多文章中说,内部存储就是手机自带的内存、手机出厂时已经有的内存。外部存储就是通过扩展SD卡的功能后增加的存储卡,这种是不正确的。
  早期的Android设备,的确内部存储时自带的、固定的。但是后来的手机将自身的存储扩展到了8G以及更高,许多手机也不再提供扩展SD卡功能。这时就只是在概念上把手机的存储划出了内部存储和外部存储。所以不管有没有SD卡,都有内部存储和外部存储。但是不管什么情况,访问内部存储和外部存储都用的同一套Android Api。

在外部存储中的数据,当卸载软件时,该软件存在私有目录/data/storage/Android/data/包名/ 下的数据将全部删掉。软件存在公有目录下的数据不会被删掉。

3、存储空间的操作

操作内部存储空间和外部存储空间的私有目录时,以context获取的。操作外部存储空间时,以Environmnet获取。方法总结如下:

内部存储

目录 方法
/data/data/包名/files context.getFilesDir()
/data/data/包名/cache context.getCacheDir()

外部存储

目录 方法
根目录 Environment.getExternalStorageDirectory()
公有目录(九大公有目录) Environment.getExternalStoragePublicDirectory(String type)
私有目录
/data/storage/Android/data/包名/files
context.getExternalFilesDir(String type)
私有目录
/data/storage/Android/data/包名/cache
context.getExternalCacheDir()

其中,公有目录的type类型,我们查看源码:

/*** Get a top-level shared/external storage directory for placing files of a* particular type. This is where the user will typically place and manage* their own files, so you should be careful about what you put here to* ensure you don't erase their files or get in the way of their own* organization.* <p>* On devices with multiple users (as described by {@link UserManager}),* each user has their own isolated shared storage. Applications only have* access to the shared storage for the user they're running as.* </p>* <p>* Here is an example of typical code to manipulate a picture on the public* shared storage:* </p>* {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java* public_picture}** @param type The type of storage directory to return. Should be one of*            {@link #DIRECTORY_MUSIC}, {@link #DIRECTORY_PODCASTS},*            {@link #DIRECTORY_RINGTONES}, {@link #DIRECTORY_ALARMS},*            {@link #DIRECTORY_NOTIFICATIONS}, {@link #DIRECTORY_PICTURES},*            {@link #DIRECTORY_MOVIES}, {@link #DIRECTORY_DOWNLOADS},*            {@link #DIRECTORY_DCIM}, or {@link #DIRECTORY_DOCUMENTS}. May not be null.* @return Returns the File path for the directory. Note that this directory*         may not yet exist, so you must make sure it exists before using*         it such as with {@link File#mkdirs File.mkdirs()}.*/public static File getExternalStoragePublicDirectory(String type) {throwIfUserRequired();
     return sCurrentUser.buildExternalStoragePublicDirs(type)[0];}

可以看出九种类型是:

类型 意义
Environment.DIRECTORY_MUSIC 音乐保存的位置
Environment.DIRECTORY_PODCASTS 用于保存podcast(博客)的音频文件
Environment.DIRECTORY_RINGTONES 保存铃声的位置
Environment.DIRECTORY_ALARMS 警报的铃声
Environment.DIRECTORY_NOTIFICATIONS 通知音保存的位置
Environment.DIRECTORY_PICTURES 下载的图片保存的位置
Environment.DIRECTORY_MOVIES 电影保存的位置
Environment.DIRECTORY_DOWNLOADS 下载文件保存的位置
Environment.DIRECTORY_DCIM 相机拍摄的图片和视频保存的位置

其中,context.getExternalFilesDir(String type)的类型有7种,看主要源码:

/*** @param type The type of files directory to return. May be {@code null}*  for the root of the files directory or one of the following*            constants for a subdirectory:*            {@link android.os.Environment#DIRECTORY_MUSIC},*            {@link android.os.Environment#DIRECTORY_PODCASTS},*            {@link android.os.Environment#DIRECTORY_RINGTONES},*            {@link android.os.Environment#DIRECTORY_ALARMS},*            {@link android.os.Environment#DIRECTORY_NOTIFICATIONS},*            {@link android.os.Environment#DIRECTORY_PICTURES}, or*            {@link android.os.Environment#DIRECTORY_MOVIES}.* @return the absolute path to application-specific directory. May return*         {@code null} if shared storage is not currently available.* @see #getFilesDir* @see #getExternalFilesDirs(String)* @see Environment#getExternalStorageState(File)* @see Environment#isExternalStorageEmulated(File)* @see Environment#isExternalStorageRemovable(File)*/@Nullablepublic abstract File getExternalFilesDir(@Nullable String type);

可以看出七种类型是:

类型 意义
Environment.DIRECTORY_MUSIC 音乐保存的位置
Environment.DIRECTORY_PODCASTS 用于保存podcast(博客)的音频文件
Environment.DIRECTORY_RINGTONES 保存铃声的位置
Environment.DIRECTORY_ALARMS 警报的铃声
Environment.DIRECTORY_NOTIFICATIONS 通知音保存的位置
Environment.DIRECTORY_PICTURES 下载的图片保存的位置
Environment.DIRECTORY_MOVIES 电影保存的位置

注意:这个方法是可以传一个null的参数的,表示获取的是当前目录。如果传入类型,则获取的是对应的子目录。

下边给出一个对上边讲述方法进行运用的一个工具类:

import android.content.Context;
import android.os.Environment;public class SDUtil {// 判断SD卡是否被挂载public static boolean isSDCardMounted() {return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());}// 获取内部存储文件的存储路径public static String getFilePath(Context context) {return context.getFilesDir().getPath();}// 获取内部存储缓存的存储路径public static String getCachePath(Context context) {return context.getCacheDir().getPath();}// 获取外部存储根的存储路径,因为不同的商家外部存储的绝对路径可能不同,所以用相对路径进行操作public static String getExternalPath() {if (isSDCardMounted()){return Environment.getExternalStorageDirectory().getAbsolutePath();}return null;}// 获取外部存储公共目录的存储路径public static String getExternalPublicPath(String type) {if (isSDCardMounted()){return Environment.getExternalStoragePublicDirectory(type).getAbsolutePath();}return null;}// 获取外部存储私有目录的文件的存储路径public static String getExternalFilePath(Context context,String type) {if (isSDCardMounted()){return context.getExternalFilesDir(type).getAbsolutePath();}return null;}// 获取外部存储私有目录的缓存的存储路径public static String getExternalCachePath(Context context,String type){if (isSDCardMounted()){return context.getExternalCacheDir().getAbsolutePath();}return null;}}

这篇博客是一篇学习总结,如有错误的地方,请大家指正。

Android内部存储与外部存储解析相关推荐

  1. Android内存解析(二)— 详解内存,内部存储和外部存储

    总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? ...

  2. Android开发--文件系统中的内部存储和外部存储最全解析 附文件数据保存操作封装

    文件存储 前言 文件存储 内存 内部存储 外部存储 内部存储操作 API 读写操作 外部存储操作 公共目录 私有目录 私有文件 私有缓存 文件各种操作封装 前言 众所周知,数据存储在每个应用中都会用到 ...

  3. 解析Android内部存储、外部存储的区别

    1.背景 在开发过程中我们都会使用到手机的内部缓存.外部缓存.但有些开发者对这两个存储区域理解还够透彻,以为手机内置的存储卡(不可手机移除)就是内部存储, 可插拔的SD卡就是外部存储,其实这些理解都是 ...

  4. android 根目录缓存,Android系统中内部存储和外部存储(公有目录、私有目录、缓存目录)详解...

    首先,明确一个概念,Android内部存储和外部存储并非所谓的手机自带内存是内部存储,SD卡是外部存储云云. Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的.git 1.概念 ...

  5. android+默认存储,Android 数据存储之SP存储,内部存储,外部存储

    Android 数据存储之SP存储,内部存储,外部存储 Android提供了多种数据存储的技术来永久的保存应用数据,以便于开发者能够根据自己的需求来选择合适的数据存储方案,主要有SharedPrefe ...

  6. 转:彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑

    转自:https://blog.csdn.net/u010937230/article/details/73303034 前言: 对于任何一个应用来说,无论是PC端应用还是Android应用,存储肯定 ...

  7. Android文件存储---内部存储,外部存储以及各种存储路径解惑

    本文转自:https://blog.csdn.net/u010937230/article/details/73303034 前言: 对于任何一个应用来说,无论是PC端应用还是Android应用,存储 ...

  8. Android开发中内存、内部存储、外部存储详解

    手机是有两个内存的.2G和16G同时出现在一个手机中,2G是指运行内存,16G是指存储内存. 手机的内存,分两种,一个是存储内存,相当于电脑的硬盘,一般手机参数里超过4G的都是指这个.存储内存是可以扩 ...

  9. android以ini文件形式保存在内部存储_彻底了解android中的内部存储与外部存储

    打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据?读 ...

最新文章

  1. 如何在pandas中使用loc、iloc函数进行数据索引
  2. BigDecimal 类型转换、运算、比较
  3. shell脚本重启tomcat
  4. 笔记-高项案例题-2019年下-人力资源管理-管理者权力-马斯洛需求理论-冲突管理...
  5. Windows环境中在同一个Tomcat下发布不同端口号的不同web程序
  6. 两个摄像头合成一路_小米手机成功开发出伸缩式摄像头,秒变单反,这次雷军又火了...
  7. 谷歌浏览器input中的text 和 button 水平对齐的问题
  8. [原创]手动配置Ubuntu Linux系列3-缺省网关和主机名
  9. 典型相关分析(CCA)
  10. Oracle 数据库的常用备份方法
  11. Excel - 图文详解Excel中相对引用和绝对引用的区别
  12. java 切割冒号_java split 冒号(java中split是什么意思啊)
  13. 手写SSH2服务器连接池
  14. OS开学考前临时抱佛jio(2)
  15. 数模国赛计算机要学什么,数学建模国赛经验分享
  16. NginxProxyManager实现unraid反向代理
  17. html鼠标划到背景图显示文字,用css3实现鼠标移入图片后显示其他文字/图片的效果...
  18. HDU - 2619 Love you Ten thousand years
  19. Linux美化贴图!
  20. 艺术家已经失业,下一个会是谁?

热门文章

  1. 机器学习三要素之策略
  2. 大量DelegatingClassLoader类加载器,导致Perm区溢出
  3. Python CSV 中查找指定字符串
  4. python字符串讲解
  5. RunLoop总结与面试
  6. 公用技术——设计模式19——行为型模式——备忘录模式——待补充
  7. (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  8. shell 随机生成10个数,找出最大值
  9. Android Day05-网络编程之文件上传
  10. 光伏行业春意盎然?一文看懂行业家底和五大趋势