热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

详解Android中的文件存储

这篇文章主要介绍了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卡存在
}

由于要存储的是独立文件,还需要添加读写权限:


通常情况下只要添加写权限即可,添加写权限就默认添了读权限,这两个权限始于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//cache
/data/data//file
/data/data//"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//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 文件存储的资料请关注其它相关文章!


推荐阅读
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文总结了汇编语言中第五至第八章的关键知识点,涵盖间接寻址、指令格式、安全编程空间、逻辑运算指令及数据重复定义等内容。通过详细解析这些内容,帮助读者更好地理解和应用汇编语言的高级特性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
author-avatar
手机用户2502906377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有