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();


目录
相关文章
|
4天前
|
安全 Android开发
Android 预置可卸载分区接收不到任何广播问题分析和解决
Android 预置可卸载分区接收不到任何广播问题分析和解决
19 0
|
3月前
|
存储 缓存 Android开发
android分区概述
android分区概述
64 0
|
3月前
|
Android开发
安卓的分区一点有用知识:super、lpunpack、lpdump
安卓的分区一点有用知识:super、lpunpack、lpdump
235 0
|
3天前
|
Android开发
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
11 0
|
3天前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
6 0
Android系统 应用存储路径与权限
|
1月前
|
存储 Android开发 C++
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
36 3
|
6月前
|
存储 安全 Java
Android DataStore:安全存储和轻松管理数据
Android DataStore:安全存储和轻松管理数据
|
2月前
|
Java Shell Android开发
安卓逆向 -- 常用命令与分区目录
安卓逆向 -- 常用命令与分区目录
25 1
|
8月前
|
XML Java Android开发
#4,Android Studio Android程序结构 工程目录介绍 文件作用 运行配置文件AndroidManifest.xml
#4,Android Studio Android程序结构 工程目录介绍 文件作用 运行配置文件AndroidManifest.xml
|
8月前
|
Java Shell 数据处理
Android 根目录下和应用目录下的build.gradle的详解,以及groovy语法的讲解
Android 根目录下和应用目录下的build.gradle的详解,以及groovy语法的讲解
154 0