Android - 文件存储

这篇具有很好参考价值的文章主要介绍了Android - 文件存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官方页面

一、概念

  • 机身存储在概念上被分为了内置存储和外置存储,插存储卡或外接U盘硬盘都属于外置存储(这年头几乎都不支持插卡,就算外接这种场景属于用户主动转移文件,而不是APP要考虑往那里存)。
  • 含有包名的路径都可以使用Context中的方法,不含有包名的路径和APP无关可以通过Environment中的方法来访问。
路径 谁还可以访问 APP卸载后存储的数据文件 权限申请
内置存储

安装目录

data/data/包名/

root 一起删除(存储的文件会算入到该APP的存储占用中) 不需要
外部存储

私有目录

storage/sdcard/Android/data/包名/

系统自带文件管理器(小米)会跳转到原生File软件供用户访问。第三方APP无法访问。 Android 4.4 以后不需要

公有目录

storage/sdcard0/名称/

第三方APP 不会删除(存储的文件不会算入该APP的存储占用中) 需要

自定义目录

storage/sdcard0/

Android 9及以前的第三方APP

二、内置存储 Internal Storage

路径:data/data/包名/

存储的数据不会被其它APP访问到(除非Root),APP卸载会一并删除,空间有限适合存储小数据。files目录存放持久化数据、cahce存放缓存数据(空间不足会被系统清理)、shared_prefs存放SharedPreference键值对文件,databases存放SQlite数据库文件。

getFilesDir( )

文件目录:data/data/包名/files

getCacheDir( )

缓存目录:data/data/包名/ceche
openFileOutput(String name,int mode) 写入文件到内部存储files目录,模式有MODE_PRIVATE私有、MODE_APPEND追加(重复调用不覆盖而是接着已存在的文件后面写)。
openFileInput(String name) 从内部存储读取文件
FileOutputStream fos = openFileOutput("文件.txt", MODE_PRIVATE);
String s = "今天天气不错";
fos.write(s.getBytes());
fos.close();
//写入
try {
    val output = openFileOutput("data", MODE_PRIVATE)
    val writer = BufferedWriter(OutputStreamWriter(output))
    //use会自动关闭流,不用手写finally去close。
    writer.use { it.write(inputText) }
} catch (e: IOException) { e.printStackTrace() }
//读取
try {
    val input = openFileInput("data")
    val reader = BufferedReader(InputStreamReader(input))
    //forEachLine会将读到的每行内容都回调到Lambda表达式中
    reader.use { reader.forEachLine { content.append(it) } }
} catch (e: IOException) { e.printStackTrace() }

三、外部存储 External Storage

存储的数据可以被其它APP访问到。

3.1 私有目录

路径:storage/emulated/Android/data/包名/

私有目录就是Android这个文件夹,这个文件夹打开之后里边有一个data文件夹,打开这个data文件夹,里边有许多包名组成的文件夹。这个目录中的文件会被计入到应用程序的占用空间当中,同时也会随着应用程序的卸载而被删除(这样有利于系统维护也避免用户的反感)。

getExternalFilesDir( ) 文件目录:storage/emulated/0/Android/data/包名/files
getExternalCacheDir( ) 缓存目录:storage/emulated/0/Android/data/包名/cache
getExternalMediaDir 已废弃:storage/emulated/0/Android/media

3.2 公有目录

路径:storage/emulated/0/

由系统创建的公有目录有九大类:DCIM相机、Screenshots截图、Download下载、Pictures图片、Movies电影、Documents文档、Music音乐、Ringtones铃声、Alarms闹铃、Notifications通知音。存储的文件不会计入到应用程序的占用空间当中,APP删除后不会删除存储在这里的数据。

  • Android9(api28)及以前:对任何文件读写均可读写。需要权限 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE。
  • Android10(api29)或更高:自己APP贡献的文件可自由读写,默认对别人APP贡献的文件只能读,实在要修改需要跳转页面让用户手动授权。

3.2.1 通过 Environment 访问(Android 9及以前)

Environment.getExternalStorageDirectory() 根目录:storage/emulated/0

Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM)

Environment.getExternalStoragePublicDirectory(DIRECTORY_ALARMS)

相机目录:storage/sdcard0/DCIM

闹铃目录:storage/sdcard0/Alarms

if(Environment.getExternalStorageState.equals(Environment.MEDIA_MOUNTED)){	
    //判断SD卡是否存在
    File dir = Environment.getExternalStorageDirectory();	//获取SD卡目录
    long totalSpace = dir.getTotalSpace();		//获取SD卡总大小
    long usableSpace = dir.getUsableSpace();		//获取SD卡可用空间
    String totalSize = Formatter.formatFileSize(this,totalSpace);	//格式化可用大小,自动换算成合适的单位
    String usableSize = Formatter.formatFileSize(this,usableSpace);	//格式化可用大小,自动换算成合适的单位
}

3.2.2 通过 MediaStore 访问(Android 10 及以后)

详见:分区存储(MediaStore、SAF)

分区存储(Scoped Storage)的推出是针对 APP 访问外部存储的行为(乱建乱获取文件和文件夹)进行规范和限制,以减少混乱使得用户能更好的控制自己的文件。公有目录被分为两大类:媒体文件(图片、音频、视频)的访问使用 MediaStore,其它文件通过系统的文件选择器访问 Storage Access Framework(简称SAF)。

3.3 自定义目录

路径:storage/sdcard0/

通过 File 手动在外置存储的根目录下创建自定义文件夹,APP删除后不会删除存储在这里的数据。为了让用户更好地管理自己的文件并减少混乱,Android10 及以后不支持自建目录。文章来源地址https://www.toymoban.com/news/detail-479085.html

类名 API 说明
File createNewFile() 创建文件
mkdir() 创建单级文件目录
mkdirs() 创建多级文件目录
delete() 删除文件或目录
FileInputStream FileInputStream(File) 创建文件输入流(File对象)
FileInput(fileName) 创建文件输入流(文件名)
read() 从创建文件输入流中读取指定字节内容
FileOutputStream FileOutputStream(File) 创建文件输出流(File对象)
FileOutputStream(fileName) 创建文件输出流(文件名)
write() 将指定内容写入创建文件输出流

到了这里,关于Android - 文件存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于 Android 没有文件存储权限保存文件的问题

    我发现Android 有些APP 他们不需要申请文件存储权限就可以进行文件的保存翻阅大量文章总结如下: 从 Android 10 开始,Android 引入了一种新的存储权限模型,其中应用需要明确请求运行时权限以访问外部存储。在这种情况下,许多应用程序可能需要请求 WRITE_EXTERNAL_STORAGE 权限才

    2024年01月17日
    浏览(45)
  • [Android] Android文件系统中存储的内容有哪些?

    如果不考虑厂商造成的差异,Android 标准的分区还是能构成一个定义良好的文件系统层的。 纵观全文,虽然没有太多技术性和需要逻辑推理的内容,但是看完之后,相信对于Android文件系统会有更深入的理解。例如我们Android开发的时候经常需要使用到的data/data目录,例如进入

    2024年01月25日
    浏览(32)
  • Android Q Download文件存储

    11 以上 存放 Download 目录中 只能通过uri 进行读取 且只能APP 安装后存放的文件 才有访问权限 APP 卸载之后 数据库中权限会被移除 无法再通过文件名称进行查询 这边通过比较描述字段进行判断是否下载过文件 11 以上APP进行卸载后在安装下载 会出现重复文件 不知是否还有其他

    2024年04月09日
    浏览(42)
  • 大数据技术原理与应用 概念、存储、处理、分析和应用(林子雨)——第三章 分布式文件系统HDFS

    大数据要解决数据存储问题,所以有了分布式文件系统(DFS),但可能不符合当时的一些应用需求,于是谷歌公司开发了GFS(Google file System)。GFS是闭源的,而HDFS是对GFS的开源实现。 1.GFS和DFS有什么区别? GFS(Google File System)和DFS(Distributed File System)都是分布式文件系统,

    2024年02月03日
    浏览(85)
  • Android 获取内部存储中音乐文件的正确姿势

    最近想写一个音乐的小APP出来(doge),借此熟悉音频开发的相关技术。但是在获取 内部存储的音乐文件 时踩了一些坑...所以有了这篇帖子,简单介绍下Android的存储类别,以及如何获取内部存储中的音乐文件。 首先要理解一个概念, 内存≠内部存储 。 内存 - 程序运行是内

    2024年02月08日
    浏览(40)
  • Android Studio 修改AVD模拟器文件默认存储路径

    AndroidStudio默认的模拟器文件路径为:C:Users用户名.androidavd路径,通常windows系统上,C盘不是太大,而avd文件却不小,通常几个GB,所以有必要将avd路径换到一个非系统盘。 更换方法如下:Help - Edit Custom Properties...  增加一个新的系统变量将覆盖默认值:  保存,重启ide,重

    2024年02月16日
    浏览(64)
  • Android App专属文件(app-specific files)存储

    有很多场景,我们的App需要创建一些其他App不需要访问、不应该访问的文件,系统提供了一下两种App专属(app-specific)存储目录: 指的是:/data/user/0/packagename/…目录 该目录提供两个目录:一个专门存储持久化文件(getFileDir),一个存储缓存文件(getCacheDir)。 此目录其他App无法

    2023年04月26日
    浏览(36)
  • Android13关于获取外部存储文件的相关问题及解决方案记录

      Android的学习路上... 测试设备:vivo X90s 安卓版本: Android13 开发环境:AndroidStudio Flamingo SDK:33 最近我在Android13的环境下尝试写一个 文件选择器 ,以便日后的开发使用。但是我们知道,从Android13 (API33) 开始,外部存储权限发生了变化,要想读取外部存储文件,使用原来的权

    2024年01月15日
    浏览(66)
  • android 12版本文件操作需要的权限,需要跳转设置页面,提醒用户手动设置

    安卓12版本的,API31,在对文件file操作时,除了申请 这个是在API30以上都需要的,否则就会报找不到文件的错误  跳转设置项,用户手动打开当前APP的文件操作权限

    2024年02月12日
    浏览(58)
  • 相机的机身马达有什么用?

    为什么我的尼康D3200相机明明拥有拍视频能力,但是拍摄视频时却不能对焦 那是因为你的相机缺少机身马达,并且你所使用的镜头也没有马达! 机身马达 是用于给镜头提供对焦动力的装置。它的作用是使相机具备自动对焦功能。如果相机配备了机身马达, 那么无论是搭配有马

    2024年02月20日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包