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文件夹。
外部存储分区的访问
外部存储可能是不可用的,比如遇到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();