详解Android 中的文件存储

 更新时间:2021年03月19日 08:30:06   作者:caizhenghe  
这篇文章主要介绍了Android 中的文件存储的相关资料,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下

概要

当我们查看手机的文件管理器的时候,会发现里面的文件五花八门,想要找到自己项目所对应的文件非常困难,甚至有可能压根就找不到自己的文件,本文就来介绍一下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目录下。

以上就是详解Android 中的文件存储的详细内容,更多关于Android 文件存储的资料请关注脚本之家其它相关文章!

相关文章

  • Android中RecyclerView嵌套滑动冲突解决的代码片段

    Android中RecyclerView嵌套滑动冲突解决的代码片段

    这篇文章主要为大家详细介绍了Android中RecyclerView嵌套滑动冲突解决的代码片段,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 手把手教学Android用jsoup解析html实例

    手把手教学Android用jsoup解析html实例

    本篇文章主要介绍了手把手教学Android用jsoup解析html实例,jsoup 是一款Java 的HTML解析器。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android使用CountDownTimer实现倒数定时器效果

    Android使用CountDownTimer实现倒数定时器效果

    这篇文章主要介绍了Android使用CountDownTimer实现倒数定时器效果的资料,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2017-02-02
  • Android  View移动的六种方法小结

    Android View移动的六种方法小结

    在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍android view移动的六种方法,对android view移动相关知识感兴趣的朋友一起学习吧
    2015-12-12
  • 深入浅析Android JSON解析

    深入浅析Android JSON解析

    android中网络数据传输是经常被用到的,通常我们使用xml或者json,而json更加轻量,便捷,我们使用的更多。我自己在项目中使用很多,今天就说说android中怎么去解析JSON,帮助自己总结内容,同时帮助别人少走弯路
    2015-12-12
  • Kotlin中协程的创建过程详析

    Kotlin中协程的创建过程详析

    使用协程的专业开发者中有超过 50% 的人反映使用协程提高了工作效率,下面这篇文章主要给大家介绍了关于Kotlin中协程创建过程的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • Android自定义视图中图片的处理

    Android自定义视图中图片的处理

    Android系统提供了ImageView显示普通的静态图片,也提供了AnimationDrawable来开发逐帧动画,还可通过Animation对普通图片使用补间动画。图形、图像处理不仅对Android系统的应用界面非常重要,而且Android系统上的益智类游戏、2D游戏都需要大量的图形、图像处理
    2022-07-07
  • Android虚拟导航键的显示隐藏实例

    Android虚拟导航键的显示隐藏实例

    下面小编就为大家分享一篇Android虚拟导航键的显示隐藏实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Android通过json向MySQL中读写数据的方法详解【写入篇】

    Android通过json向MySQL中读写数据的方法详解【写入篇】

    这篇文章主要介绍了Android通过json向MySQL中读写数据的方法,结合实例形式较为详细的分析了Android json类的定义、调用及php接收json数据并写入mysql的实现技巧,需要的朋友可以参考下
    2016-06-06
  • 解决AndroidStudio无法运行java中的mian方法问题

    解决AndroidStudio无法运行java中的mian方法问题

    这篇文章主要介绍了解决AndroidStudio无法运行java中的mian方法问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10

最新评论