Android内、外存储分区&常用存储目录,getExternalStorageDirectory获取的是storage/emulated/0/

简介: Android内、外存储分区&常用存储目录,getExternalStorageDirectory获取的是storage/emulated/0/

getExternalStorageDirectory获取的是storage/emulated/0/



你在debug 的时候通过getExternalStorageDirectory获取的是storage/emulated/0/原因是由于你的文件读取权限没有


通过Environment获取的路径



Environment.getDataDirectory().getPath() :                                   获得根目录/data 内部存储路径


Environment.getDownloadCacheDirectory().getPath()  :               获得缓存目录/cache


Environment.getExternalStorageDirectory().getPath():                  获得SD卡目录/mnt/sdcard(获取的是手机外置sd卡的路径)


Environment.getRootDirectory().getPath() :                                   获得系统目录/system


通过Context获取的路径


Context.getDatabasePath()                                                      返回通过Context.openOrCreateDatabase 创建的数据库文件


Context.getCacheDir().getPath() :                                            用于获取APP的cache目录 /data/data//cache目录


Context.getExternalCacheDir().getPath()  :                             用于获取APP的在SD卡中的cache目录/mnt/sdcard/Android/data//cache


Context.getFilesDir().getPath()  :                                             用于获取APP的files目录 /data/data//files


Context.getObbDir().getPath():                                                用于获取APPSDK中的obb目录 /mnt/sdcard/Android/obb/


Context.getPackageName() :                                                  用于获取APP的所在包目录


Context.getPackageCodePath()  :                                          来获得当前应用程序对应的 apk 文件的路径


Context.getPackageResourcePath() :                                    获取该程序的安装包路径


存储的”内“和“外”



所有Android设备都有两个文件存储区域:内部存储空间(internal Storage)和外部存储空间(external Storage)。


所以,Android系统从逻辑上,只分为"internal Storage" 与 “external Storage” 两个存储分区。


内部存储分区(internal Storage)


内部存储分区,物理位置主要包括了Android系统根目录下的/data、/System、/cache等目录。


内部存储分区的特点:内部分区总是可用。它存放App私有文件,并且不可被其他App访问。


App卸载后,存储在内部分区上的该App数据将会被清除。不需要额外申请权限。


外部存储分区(external Storage):手机文件管理器能够看到的文件,包括sd卡

它有以下几个特点:外部分区并不总是可用。保存在这里的文件可能被其他程序访问。

当用户卸载app时,系统仅仅会删除external中的缓存目录(Context.getExternalCacheDir())和file目录(Context.getExternalFilesDir())下的相关文件。需要申请WRITE_EXTERNAL_STORAGE或READ_EXTERNAL_STORAGE权限。


我们在开发过程中,经常需要读取或者存储一些数据,这些数据可以存储在内部分区中,也可以存储在外部分区中,但不同的操作方式会有很大区别,我们下面来详细进行分析。


子目录


/system/app:存放rom本身附带的软件即系统软件。

/system/data:存放/system/app中,核心系统软件的数据文件信息。

/system/priv-app:存放手机厂商定制的系统级别的应用的apk文件。

/system/bin:存放系统的本地程序,里面主要是Linux系统自带的组件。

/system/media:存放一些音效、铃声、开关机动画等。

/data目录

/data目录时我们App私有数据存储的顶级目录,可以通过Environment.getDataDirectory()获取。

Environment.getDataDirectory()源码:


private static final File DIR_ANDROID_DATA = getDirectory(ENV_ANDROID_DATA, "/data");
    /**
     * Return the user data directory.
     */
    public static File getDataDirectory() {
        return DIR_ANDROID_DATA;
    }

应用程序cache目录



cache目录是我们App内部存储的缓存目录。它可以通过Context对象的getCacheDir()方法来获得,位置是通常是:/data/data//cache文件夹。如果您想暂时保留而非永久存储某些数据,则应使用特殊的缓存目录来保存这些数据。不应依赖系统为您清理这些文件,而应始终自行维护缓存文件,使其占用的空间保持在合理的限制范围内(例如 1MB)。当用户卸载您的应用时,这些文件也会随之移除。


getCacheDir()方法

Context对象的getCacheDir()方法可以获取cache目录。


ContextImpl中的源码:


@Override
public File getCacheDir() {
synchronized (mSync) {
if (mCacheDir == null) {
mCacheDir = new File(getDataDir(), "cache");
}
return ensurePrivateCacheDirExists(mCacheDir, XATTR_INODE_CACHE);
}
}


cache文件有以下几个特点需要注意:


系统将在磁盘空间不足时自动删除此目录中的文件。

系统将始终首先删除旧文件。


我们可以使用StorageManager类的相关方法更好的管理我们的删除规则。

App所占缓存空间的大小可以通StorageManager.getCacheQuotaBytes(java.util.UUID)来获得。


超过App所分配限额的缓存空间将被优先删除,我们应该尽可能的使我们的cache空间内的文件低于限额值,这会使得我们的cache文件最大可能的减少被删除的概率。


databases目录


databases目录存放了应用程序的数据库文件,位置是通常是:/data/data//databases文件夹。


be8c8da661a74758bf123f7ff8273827_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

外部存储分区的访问

 

外部存储可能是不可用的,比如遇到SD卡被拔出等情况时,因此在访问之前应对其可用性进行检查。我们可以通过执行getExternalStorageState()来查询外部存储设备的状态,若返回状态为MEDIA_MOUNTED, 则可以读写。


/sdcard

外部存储的sd卡根目录,也就是我们平时从文件管理器中能看到的最顶级目录,它的File绝对路径为:/storage/emulated/0。


访问方式

可以通过Environment类的getExternalStorageDirectory方法访问:


storage/emulated/0 是存储在什么地方?



c0aeb35b733541999a647b9db25dae70_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

是一个文件。storage/emulated/0/其实是你的SD卡路径,里面的内容也就是卡上的内容,该路径只是个挂载点 。应该在手机的download文件里面。


它是 “模拟SD卡”(不是真实的SD卡) 这一事实。


这是引用路径,别担心。打开ddmsFileExplorer,可以在你的mnt/sdcard后面看到一列info,列里面写的就是类似于/storage/emulated/0/这个东西,然后可以在你的FileExplorer中找storage文件夹,下面就会有emulated,然后下面会有0,其实都是一样的。


android读取sdcard路径下的文件的方法


直接写文件目录 mnt/sdcard/


Android 在外部存储中创建文件夹


创建文件是先new 在create


file = new File(video_savePath);
    if (!file.exists()) {
      // 创建文件
      file.createNewFile();


目录
相关文章
|
5月前
|
存储 API 文件存储
47. 【Android教程】SharedPreferences 存储
47. 【Android教程】SharedPreferences 存储
58 2
|
3月前
|
安全 Java Android开发
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
如何解压OTA升级包、编辑升级包内容(例如移除不需要更新的分区)、重新打包、签名以及验证OTA文件的过程。
215 2
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
|
6月前
|
Shell Android开发
MT8385 Android AB分区系统升级(命令模式)
MT8385 Android AB分区系统升级(命令模式)
65 0
|
3月前
|
存储 安全 API
Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
本文介绍了 Android 开发中常用的键值对存储方案,包括 SharedPreferences、MMKV 和 DataStore,并对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。
79 1
|
3月前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
156 1
|
5月前
|
Android开发
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
233 0
|
6月前
|
存储 缓存 Android开发
Android系统分区与升级
Android系统分区与升级
114 4
|
6月前
|
存储 监控 Java
Android Service之设备存储空间监控 DeviceStorageMonitorService
Android Service之设备存储空间监控 DeviceStorageMonitorService
119 2
|
6月前
|
存储 缓存 Linux
Android 系统的分区
Android 系统的分区
59 1
|
6月前
|
存储 API Android开发
Android 11 中的存储机制更新,面试心得体会
Android 11 中的存储机制更新,面试心得体会