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

1,080 阅读5分钟

目录

getExternalStorageDirectory获取的是storage/emulated/0/

通过Environment获取的路径

存储的”内“和“外”

应用程序cache目录

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

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

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


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/<app包名>/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/<app包名>/databases文件夹。


外部存储分区的访问

 


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

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

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

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

​编辑

是一个文件。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();

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿