共计 3171 个字符,预计需要花费 8 分钟才能阅读完成。
概要
当咱们查看手机的文件管理器的时候,会发现外面的文件形形色色,想要找到本人我的项目所对应的文件十分艰难,甚至有可能压根就找不到本人的文件,本文就来介绍一下 APP 开发过程当中文件存储的注意事项。
通常咱们会将寄存的文件分为两种:独立文件和专属文件。顾名思义,独立文件就是独立于 APP 之外的文件,不会随着 APP 的删除而删除,而专属文件则是专属于某个 APP 的文件,当 APP 删除后,会主动清空绝对应的专属文件。
独立文件
独立文件指的是寄存在 shared/external storage directory 下的文件,通常意义上就是咱们的 SD 卡。能够通过以下办法获取 SD 卡门路:
Environment.getExternalStorageDirectory ()
不倡议将文件存储在 SD 卡的根目录下,这样会净化用户的 SD 卡根目录,通常是在根目录下建设一个次级目录并将文件存储在次级目录上面:
File sdCardDir = Environment.getExternalStorageDirectory ();
File cacheDir = new File(sdCardDir, "Cache");
失去的门路如下所示:
/storage/emulated/0/Cache
不同平台下 SD 卡的门路有所差异,所以开发者通常都是持有一个相对路径。
Tips:不同手机厂商内部存储根目录(Environment.getExternalStorageDirectory())的物理地址不肯定雷同,但它们映射之后的根目录通常都是统一的,映射之后的根目录为:/mnt/sdcard/
还能够通过另一种办法获取一个 SD 卡的次级目录:
Environment.getExternalStoragePublicDirectory(String)
针对于该办法,Android 曾经给出了一套固定的 String 参数:
Environment.DIRECTORY_ALARMS
Environment.DIRECTORY_DCIM
Environment.DIRECTORY_DOCUMENTS
Environment.DIRECTORY_DOWNLOADS
Environment.DIRECTORY_MOVIES
Environment.DIRECTORY_MUSIC
Environment.DIRECTORY_NOTIFICATIONS
Environment.DIRECTORY_PICTURES
Environment.DIRECTORY_PODCASTS
Environment.DIRECTORY_RINGTONES
// ps: 调用 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
// 失去的门路就是:/storage/emulated/0/Pictures
集体还是更喜爱第一种办法,因为第一种办法更加的灵便,能够自定义次级目录。
当然,在向 SD 卡存储文件之前,还须要判断 SD 卡是否存在,判断的办法如下:
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){// SD 卡存在}
因为要存储的是独立文件,还须要增加读写权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
通常状况下只有增加写权限即可,增加写权限就默认添了读权限,这两个权限始于 Android4.4(KITKAT)
专属文件
专属文件能够寄存在 external storage,也能够寄存在 internal storage。external storage 指的是 SD 卡,internal storage 指的是手机自带的存储区域。有人可能会有疑难:之前独立文件不也寄存在 SD 卡中吗?怎么专属文件也放在 SD 卡中,咱们的 APP 怎么辨别这两者呢?其中独立文件通常是寄存在 SD 卡的次级目录下,比方方才提到的 ” 根目录 /Cache”,而专属文件则是存储于 ” 根目录 /Android/data/packge name” 目录上面,当 APP 删除时,会主动销毁这个文件夹。
通常状况下,咱们会将一些体量比拟小的数据寄存在 internal storage 中,比方 Shared Prefrence 文件或者数据库文件,而将一些体量较大的文件放在 external storage 中,比方视频,图片文件。
存储专属文件不须要读写权限~~
internal storage
获取 APP 在 internal storage 中存储门路的办法如下:
getCacheDir();
getFileDir();
getDir("name", mode);
失去的门路如下所示:
/data/data/<package name>/cache
/data/data/<package name>/file
/data/data/<package name>/"name"
这是 APP 的公有门路,对于没有 root 过的手机,用户是无法访问该门路的,所以安全性有所保障(开发人员能够在 AS3.0 以上版本的 Device File Explorer 中拜访该门路)。同时手机的 SD 卡并不是任何时候都可用的,所以咱们必须要将重要的数据寄存在 internal storage 中。
依据 Android SDK 的说法,当手机磁盘空间有余时,零碎会主动将革除 cache 目录下的文件(除 cache 以外的其它外部存储空间不会被主动革除)。针对这种状况,须要将缓存尽可能存储在非 cache 文件夹中;或者将 cache 文件夹下的文件大小管制在零碎指标之下,获取零碎指标的办法如下:
getCacheQuotaBytes(java.util.UUID)
如果管制在该指标以下,文件的革除优先级将会被排到最低(指标是 Android8.0 个性)。
external storage
获取 APP 在 external storage 中存储门路的办法如下:
getExternalCacheDir()
失去的门路之前也提过一笔,如下所示:
/storage/emulated/0/Android/data/<package name>/cache
相熟了 external storage 的门路后,也能够通过 SD 卡的根目录来手动创立门路:
File dataDir = new File(new File(Environment.getExternalStorageDirectory(), "Android"), "data");
File externalCacheDir = new File(new File(dataDir, context.getPackageName()), "cache");
if (!externalCacheDir.exists()) {externalCacheDir.mkdirs();
}
除了下面提到过的视频、图片文件,有的时候,开发者还心愿在 APP 的专属门路下放一些可拜访的文件,比方 crash 或者 debug 的 log 日志文件,此时 internal storage 不能满足需要(用户无法访问 internal storage 并反馈具体日志),就能够将这些专属文件放在 external storage 目录下。
参考文献:
https://developer.android.com…
https://developer.android.goo…
http://blog.csdn.net/nugongah…