一、简述
-
apk中有两种资源文件,raw下的和assert下的,这些数据只能读取,不能写入,两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。需要注意的是两种资源文件中单个文件大小不能超过1M (Android2.3之前,目前貌似没有这个限制了)。res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类,res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
-
SD卡中的文件使用FileInputStream和FileOutputStream进行文件的操作。
-
存放在数据区(/data/data/..)的文件只能使用openFileOutput和openFileInput进行操作。注意这里不能使用FileInputStream和FileOutputStream进行文件的操作。
在安卓开发中,经常会用到一些需要操作文件的需求,自己一直对api和文件路径相关的对应关系模糊不清楚,今天有时间来整理记录下,免得以后忘记了。
ps:由于手里没有可以装SD卡的机器,所以以下测试结果均是在无外置sd卡的手机上的测试结果
二、开始测试
首先看以下代码
ps:以下测试机型均为Vivo X9(android 7.1.2 api 25)和MeiZu M3(android 5.1 api 22)
getFilesDir();
getExternalCacheDir();
getPackageCodePath();
getPackageResourcePath();
getCacheDir();
getExternalFilesDir(null);
Environment.getExternalStorageState();
Environment.getExternalStorageDirectory();
Environment.getDataDirectory();
Environment.getDownloadCacheDirectory();
Environment.getRootDirectory();
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
以上几个测试对应的路径为:


通过以上观察可以发现,有几个api不同机型还是有点不同的,国产厂商定制系统,进行了对应的修改,使用的时候还是要小心点,防止“掉坑”。
这里吐槽一下CSDN图片编辑太烂,图片格式真心不好调整,想放在一行都不行,下面做一个总结记录:
Environment.getDataDirectory() =
/data
Environment.getDownloadCacheDirectory() =
/data/cache (vivo)
/cache (meizu)
Environment.getExternalStorageDirectory() =
/storage/emulated/0
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) =
/storage/emulated/0/Pictures
Environment.getRootDirectory() =
/system
getPackageCodePath() =
/data/app/com.demo.mydemoapplication-1/base.apk
getPackageResourcePath() =
/data/app/com.demo.mydemoapplication-1/base.apk
getCacheDir() =
/data/data/com.demo.mydemoapplication/cache (meizu)
/data/user/0/com.demo.mydemoapplication/cache (vivo)
getDatabasePath(“test”) =
/data/data/com.demo.mydemoapplication/databases/test
getDir(“test”, Context.MODE_PRIVATE) =
/data/data/com.demo.mydemoapplication/app_test
getExternalCacheDir() =