概要

当咱们查看手机的文件管理器的时候,会发现外面的文件形形色色,想要找到本人我的项目所对应的文件十分艰难,甚至有可能压根就找不到本人的文件,本文就来介绍一下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_ALARMSEnvironment.DIRECTORY_DCIMEnvironment.DIRECTORY_DOCUMENTSEnvironment.DIRECTORY_DOWNLOADSEnvironment.DIRECTORY_MOVIESEnvironment.DIRECTORY_MUSICEnvironment.DIRECTORY_NOTIFICATIONSEnvironment.DIRECTORY_PICTURESEnvironment.DIRECTORY_PODCASTSEnvironment.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...