Android中的各种目录
Android开发中涉及到很多存储的知识,比如会读取各种目录下的文件,将文件写到指定的目录下。这时候就要对Android的目录结构和系统提供的目录相关的属性和API有所熟悉。与目录相关的方法在Context和Environment类中。
Context上下文提供了一些方法,获取不同的目录。接下来一一介绍这些方法。
1.1、getFileStreamPath(String name)
返回使用openFileOutput(String,int)创建的文件在文件系统上的绝对路径。获取的File文件在/data/user/0/包名/files/路径下。参数:想要获取其路径的文件的名称。
1.2、getCacheDir()
返回文件系统上应用程序特定的缓存目录的绝对路径。返回的File是个目录,路径为:/data/user/0/包名/cache
1.3、getExternalCacheDir()
返回到主共享/外部存储设备上应用程序特定目录的绝对路径,应用程序可以在其中放置其拥有的缓存文件。这些文件是应用程序的内部文件,通常作为介质对用户不可见。目录路径:/storage/emulated/0/Android/data/包名/cache/。也就是用户文件管理器能够直接范围的根目录下的Android/data/文件夹。
该路径的官方API说明如下:
“就像getCacheDir()一样,在卸载应用程序时,这些文件将被删除,但是有一些重要的区别:
①平台并不总是监视共享存储中的可用空间,因此可能不会自动删除这些文件。应用程序应始终管理此位置使用的最大空间。当前,平台在这里唯一一次删除文件的时间是在android.os.Build.VERSION_CODES#JELLY_BEAN_MR1或更高版本上运行,并且Environment.isExternalStorageEmulated(File)返回true时。
②由于用户可以弹出可移动介质,因此共享存储可能并不总是可用。可以使用Environment.getExternalStorageState(File)检查媒体状态。
③这些文件没有安全性。例如,任何拥有android.Manifest.permission#WRITE_EXTERNAL_STORAGE的应用程序都可以写入这些文件。”
例如,BiliBili视频频缓存就在该目录下:/Android/data/tv.danmaku.bili/download/
1.4、getDatabasePath(String database)
参数:给定数据库的绝对路径。
返回通过openOrCreateDatabase()方法创建的数据库的位置。数据库文件路径:/data/user/0/包名/databases/。
1.5、getDataDir() API Level 24
返回文件系统上目录的绝对路径:/data/user/0/包名,该目录存储了属于该应用程序的所有私有文件。 应用程序不应直接使用此路径; 他们应该改用:getFilesDir()、getCacheDir()、getDir(String,int)或此类中的其他存储API。
1.6、 getDir(String nameDir, int mode);
参数:要检索的目录名称。 这是作为应用程序数据的一部分创建的目录。
文件操作模式。
检索并创建应用程序可以放置其自定义数据文件的新目录。目录路径为:/data/user/0/包名/app_nameDir
1.7、getExternalFilesDir(String type)
参数:要返回的文件目录的类型。 对于文件目录的根目录,可能是null。对于子目录,它可能是以下常量之一:
android.os.Environment.DIRECTORY_MUSIC
android.os.Environment.DIRECTORY_PODCASTS
android.os.Environment.DIRECTORY_RINGTONES
android.os.Environment.DIRECTORY_ALARMS
android.os.Environment.DIRECTORY_NOTIFICATIONS
android.os.Environment.DIRECTORY_PICTURES
android.os.Environment.DIRECTORY_MOVIES
android.os.Environment.DIRECTORY_DOWNLOADS
android.os.Environment.DIRECTORY_DCIM
android.os.Environment.DIRECTORY_DOCUMENTS
返回主共享/外部存储设备上目录的绝对路径,应用程序可以在其中放置其拥有的永久文件。这些文件是应用程序的内部文件,通常不会被用户视为媒体。目录位于目录:/storage/emulated/0/Android/data/包名/files/下
1.8、getFilesDir()
返回文件系统上目录的绝对路径,其中存储使用openFileOutput(String,int)创建的文件。获取的目录为:/data/user/0/包名/files。前面
getFileStreamPath(String name)方法获取的就是这个目录中的文件。
1.9、getNoBackupFilesDir()
返回类似于getFilesDir()的文件系统上目录的绝对路径。 区别在于放置在此目录下的文件将从自动备份到远程存储中排除。 有关Android中自动备份机制的完整讨论,请参见android.app.backup.BackupAgent BackupAgent。目录为:/data/user/0/包名/no_backup
1.10、getObbDir()
返回主应用程序的OBB文件(如果有)的主共享/外部存储目录。请注意,如果应用程序没有任何OBB文件,则此目录可能不存在。目录:/storage/emulated/0/Android/obb/包名
OBB(Opaque Binary Blob)文件格式,是安卓游戏通用数据包。在一些大型游戏上较为常见,同时还附以Data文件,亦或是md5.dat文件出现。通常在游戏开始前,程序会自动将obb解包至/sdcard/Android/data或者是/android/obb目录下。但也有游戏不会解包,直接读取。--百度百科-obb (文件格式)
1.11、getCodeCacheDir() API Level 21
返回设计用于存储缓存代码的文件系统上应用程序特定缓存目录的绝对路径。目录路径:/data/user/0/包名/code_cache
Environment类是Android提供的类方便对安卓系统环境变量的访问。
2.1、getDataDirectory()
返回用户数据目录。目录:/data/
2.2、getDownloadCacheDirectory()
返回下载/缓存内容目录。目录:/cache/
2.3、getRootDirectory()
返回包含核心Android OS的系统分区的目录。 始终存在且以只读方式安装。目录:/system
2.4、getExternalStorageDirectory() *
返回主共享/外部存储目录,也就是用户存储器根目录。目录路径:/storage/emulated/0/ 。大量的APP乱使用这个方法在根目录下创建各种乱七八糟的文件,该方法已经废弃。
为了提高用户隐私,不建议直接访问共享/外部存储设备。 当应Build.VERSION_CODES≥Q,即Android 10以后时,此方法返回的路径将不再可供应用直接访问。 通过Context.getExternalFilesDir(String)、MediaStore或Intent.ACTION_OPEN_DOCUMENT之类的替代方案,应用程序可以继续访问共享/外部存储中存储的内容:
public static String getSDPath(Context context) {
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);// 判断sd卡是否存在
if (sdCardExist) {
if (Build.VERSION.SDK_INT >= 29) {
//Android10之后
sdDir = context.getExternalFilesDir(null);
} else {
sdDir = Environment.getExternalStorageDirectory();// 获取SD卡根目录
}
} else {
sdDir = Environment.getRootDirectory();// 获取跟目录
}
return sdDir.toString();
}
Android 10以后应用就无法正常在storage目录下到处乱写文件创建目录了。需要进行一些适配。在manifest文件中的<application>标签下加上这个属性:android:requestLegacyExternalStorage="true"。这是因为Android 10.0改变了文件的存储方式,加这个属性是启用旧的存储方式。
2.5、getExternalStoragePublicDirectory(String type) *
获取顶级共享/外部存储目录以放置特定类型的文件。比如根目录下的公共音乐文件夹:/storage/emulated/0/Music 。type前面已经介绍过,使用Context.getExternalFilesDir(String type)方法获取应用自己的这些类型目录一样:
android.os.Environment.DIRECTORY_MUSIC
android.os.Environment.DIRECTORY_PODCASTS
android.os.Environment.DIRECTORY_RINGTONES
android.os.Environment.DIRECTORY_ALARMS
android.os.Environment.DIRECTORY_NOTIFICATIONS
android.os.Environment.DIRECTORY_PICTURES
android.os.Environment.DIRECTORY_MOVIES
android.os.Environment.DIRECTORY_DOWNLOADS
android.os.Environment.DIRECTORY_DCIM
android.os.Environment.DIRECTORY_DOCUMENTS
2.6、getExternalStorageState() *
返回主要共享/外部存储介质的当前状态。返回String类型的状态,定义在Environment中有以下一些public字段:
MEDIA_UNKNOWN
MEDIA_REMOVED
MEDIA_UNMOUNTED
MEDIA_CHECKING
MEDIA_NOFS
MEDIA_MOUNTED
MEDIA_MOUNTED_READ_ONLY
MEDIA_SHARED
MEDIA_BAD_REMOVAL
MEDIA_UNMOUNTABLE
相关博客:
关于Android10.0后创建文件夹失败的问题
Android10.0 外部存储(/storage/emulated/0)无法创建文件夹
Android10(Api 29)新特性适配小结
Android_存储访问框架SAF