Android 文件存储系统原理

目录
  • 存储的可选项
  • 存储位置的划分
    • 内部存储空间
    • 外部存储空间
    • App 私有目录
    • 外部公共目录
    • 系统目录
    • 清除数据和清除缓存
    • 清除数据
    • 清除缓存
  • 数据管理权限

存储的可选项

Android 的文件系统类似于其他平台的基于磁盘的文件系统。包括以下几种存储类别:

  • App 私有的存储空间
  • 共享的存储空间
  • Preferences,以 key-value 的形式存储一些原始的内容,如 SharedPreferences。
  • 数据库

不同的存储类别扮演了不同的角色,比如 App 的私有存储空间是无法被外部访问的,可以用来存储一些 App 私有的敏感信息;共享的存储空间可以存储一些所有应用都可以访问的文件,例如媒体、文档等可公开的文件;数据库则是用来处理持久化的;Preferences 用来存储一些本地字段。

存储位置的划分

Android 系统的文件存储位置划分为两大类:内部存储空间和外部存储空间 ,其中,外部存储空间又包括 App 私有目录和公共目录。

在大多数设备上,内部存储空间是小于外部的,但是内部存储空间是始终可以使用的,与之相反,一些可以插 SD 卡的设备的外部存储空间是可以拓展的,所以意味着 SD 卡这部分存储空间不是始终可用的。

内部存储空间

内部存储空间是 App 私有的存储数据的存储空间,系统会阻止其他应用对这部分数据的访问,并且在 Android 10(API 级别 29)及更高版本中,系统会对这些位置进行加密。 内部存储空间的特性让它很适合存储只有 App 本身才能访问的敏感数据。

内部存储空间可以通过Context.getFileDir()Context.getCacheDir()获取到,主要路径是:

Context.getFileDir() 获取的路径为:
- data/data/packagename/files (部分手机厂商)
- data/user/0/packagename/files (部分手机厂商)

Context.getCacheDir() 获取的路径为:
- data/data/packagename/cache (部分手机厂商)
- data/user/0/packagename/cache (部分手机厂商)

外部存储空间

外部存储空间包括 App 私有目录和公共目录。

  • App 私有目录: App 的私有目录指其他应用可以访问当前应用该目录下的数据,应用卸载后也会随之删除。
  • 公共目录:外部可以自由访问,应用删除后这部分存储的数据不会删除。

App 私有目录

// 可以通过以下函数获取
Context.externalCacheDir
Context.externalCacheDirs
Context.getExternalFilesDir(String)
Context.getExternalFilesDirs(String)
Context.externalMediaDirs

对应的目录是:

externalCacheDir: /storage/emulated/0/Android/data/com.chunyu.workdemo/cache
externalCacheDirs: /storage/emulated/0/Android/data/com.chunyu.workdemo/cache
ExternalFilesDir: /storage/emulated/0/Android/data/com.chunyu.workdemo/files
ExternalFilesDirs: /storage/emulated/0/Android/data/com.chunyu.workdemo/files
externalMediaDirs: /storage/emulated/0/Android/media/com.chunyu.workdemo

这里的com.chunyu.workdemo是 packageName。

外部公共目录

不要被这里的“外部”这个词弄糊涂了。最好将此目录视为媒体/共享的存储部分。它是一个文件系统,可以保存相对大量的数据,并且在所有应用程序之间共享(不强制执行权限)。传统上这是一张 SD 卡,但它也可以作为设备中的内置存储实现,与受保护的内部存储不同,并且可以作为文件系统安装在计算机上。

在具有多个用户的设备上(如 UserManager 所述),每个用户都有自己的隔离共享存储。应用程序只能访问它们正在运行的用户的共享存储。

获取方式:

Environment.getExternalStorageState() // SD 卡状态
Environment.getExternalStorageDirectory()
Environment.getExternalStoragePublicDirectory(String)

输出内容:

getExternalStorageState: mounted // 已挂载
getExternalStorageDirectory: /storage/emulated/0 
getExternalStoragePublicDirectory: /storage/emulated/0

getExternalStorageDirectorygetExternalStoragePublicDirectory已经被标记为弃用,可以使用Context.getExternalFilesDir(String)、MediaStore 或Intent.ACTION_OPEN_DOCUMENT等替代方案,它们性能更好。

在上述的需要传递 String 参数的方法中,例如Context.getExternalFilesDir(String)getExternalStoragePublicDirectory(String),String 有以下几个常量值:

> DIRECTORY_MUSIC // 音乐
> DIRECTORY_PODCASTS // 博客
> DIRECTORY_RINGTONES // 铃声
> DIRECTORY_ALARMS // 闹钟
> DIRECTORY_NOTIFICATIONS // 通知
> DIRECTORY_PICTURES // 图片
> DIRECTORY_MOVIES // 电影
> DIRECTORY_DOWNLOADS // 下载
> DIRECTORY_DCIM // 照片
> DIRECTORY_DOCUMENTS // 文档

不能传递空值。

系统目录

Environment 还提供了对一些系统目录的访问方法:

Environment.getRootDirectory()  // 系统分区的 root 路径
Environment.getDataDirectory()  // 获取用户数据目录的路径
Environment.getDownloadCacheDirectory() // 获取用户缓存目录的路径
// 输出为
getRootDirectory: /system
getDataDirectory: /data
getDownloadCacheDirectory: /data/cache

清除数据和清除缓存

在 App 中,从上面的方法名中我们也能体会到 cache 和 file 两种路径,应该有不同的作用。

清除数据

清除数据清除的是保存在app中所有数据,就是上面提到的位于 packageName 下面的所有文件,包含内部存储/data/data/packagename/和外部存储 /storage/emulated/0/Android/data/packagename/

清除缓存

缓存是程序运行时的临时存储空间,它可以存放从网络下载的临时图片,从用户的角度出发清除缓存对用户并没有太大的影响,但是清除缓存后用户再次使用该APP时,由于本地缓存已经被清理,所有的数据需要重新从网络上获取。为了在清除缓存的时候能够正常清除与应用相关的缓存,请将缓存文件存放在getCacheDir()或者getExternalCacheDir()路径下。

数据管理权限

某些应用的使用场景时需要广泛访问设备上的文件,但无法采用注重隐私保护的存储最佳做法高效地完成这些操作。对于这些情况,Android 提供了一种名为“所有文件访问权限”的特殊应用访问权限。 例如,防病毒应用的主要场景可能是需要定期扫描不同目录中的许多文件。如果此扫描需要反复的用户交互,让用户使用系统文件选择器选择目录,可能就会带来糟糕的用户体验。其他场景(如文件管理器应用、备份和恢复应用以及文档管理应用)可能也需要考虑类似情况。

应用可以通过执行以下操作向用户请求“所有文件访问权限”:

  • 在清单中声明MANAGE_EXTERNAL_STORAGE权限。
  • 使用ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION设置 Intent ,将用户引导至一个系统设置页面,在该页面上,用户可以为您的应用启用以下选项:授予所有文件的管理权限。可以通过Environment.isExternalStorageManager()方法来检查是否已获得这个权限。

MANAGE_EXTERNAL_STORAGE会授予以下权限:

  • 对公共目录中所有文件的读写权限。
  • MediaStore.Files表的内容的访问权限。
  • /Android/data//sdcard/Android/sdcard/Android 大多数子目录外,对所有内部存储目录⁠的写入权限。

获得此权限的应用仍然无法访问属于其他应用的内部存储空间,因为这些目录在存储卷上显示为 Android/data/ 的子目录。

到此这篇关于Android 文件存储系统原理的文章就介绍到这了,更多相关Android 文件存储 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android图片添加水印图片并把图片保存到文件存储的实现代码

    具体代码如下所示: package zhangphil.test; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import andro

  • 详解Android 中的文件存储

    目录 概要 当我们查看手机的文件管理器的时候,会发现里面的文件五花八门,想要找到自己项目所对应的文件非常困难,甚至有可能压根就找不到自己的文件,本文就来介绍一下APP开发过程当中文件存储的注意事项. 通常我们会将存放的文件分为两种:独立文件和专属文件.顾名思义,独立文件就是独立于APP之外的文件,不会随着APP的删除而删除,而专属文件则是专属于某个APP的文件,当APP删除后,会自动清空相对应的专属文件. 独立文件 独立文件指的是存放在shared/external storage direct

  • android I/0流操作文件(文件存储)

    目录 文件存储 I/0流操作文件 总结 文件存储 文件存储方式不受类型限制,可以将一些数据直接以文件的形式保存在设备中,例如文本文件.PDF ,音频,图片等.存储类型复杂的数据时,通常采用文件存储.Java提供一套完整的I/О流体系,通过I/О流可以非常方便地访问磁盘中的文件,同样Android 也支持I/O流方式来访问手机等移动设备中的存储文件. I/0流操作文件 进行I/О流操作文件时,需要先获得文件的输人流和输出流.在Android应用程序中,可以通过上下文环境Context对象提供的op

  • 浅析Android文件存储

    一.内部存储 内部存储,位于data/data/包名/路径下 是否需要用户权限:否 是否能被其他应用访问:否 卸载应用数据是否被删除:是 内部存储控件不需要用户权限,这意味着我们不需要用户去授权下面的权限: android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_EXTERNAL_STORAGE 对于设备中每一个安装的 App,系统都会在 data/data 目录下以应用程序包名自动创建与之对应的文件夹,可以直接读写该目

  • Android开发实现读取Assets下文件及文件写入存储卡的方法

    本文实例讲述了Android开发实现读取Assets下文件及文件写入存储卡的方法.分享给大家供大家参考,具体如下: 调用一个反编译的.so文件,查看起加密和解密情况,需要解析上万的数组,而so文件加密解密都是通过Byte来进行,又需要把String字符串转化为 Byte,当把数据直接写在代码中就会提示多Byte数组过大.最后把数组写到Assets文件加下,读取txt文本文件. 读取Assets方法如下: public String getFromAssets(String fileName) {

  • Android实现保存QQ账号与密码功能(文件存储)

    目录 1.UI界面 2.构建工具类 3.编写界面交互代码 4.运行程序 大家好,我是汤姆凯特. 写在前面:今天用保存QQ账号和密码的实战演练,带大家掌握Android存储中最基本的文件存储方式 文件存储是Android中最基本的一种数据存储方式,它与Java中的文件存储类似,都是通过I/O流形式把数据直接存储到文件中,下面我们一起来看一下如何用Android实现文件存储功能吧! 1.UI界面 1)垂直线性布局为整体框架 2)头像获取 3)子线性布局编辑框和密码框 4)登录button按钮 <?x

  • Android存储字符串数据到txt文件

    需求: android存储字符串数据简单的有SharePerfence不过只能存储89kb最多的数据(好像),超过这个数据如果不方便网络存储,只能用文件存储了,这里写了一个工具类,存储到txt文件(不重要的数据,但是体量大) 代码: 1.工具类 package com.xxx.util; import android.os.Environment; import android.util.Log; import java.io.BufferedReader; import java.io.Fil

  • Android开发文件存储实例

    Android的文件存储,有I/O流的方式存储,与java一样,还有一种Android自己的SharePreferences存储方法. 下面看一个例子: 用I/O流的方式存储方法和SharePreferences存储方法,存放QQ账号和密码,再次进入页面时,把存储在文件中的账号密码显示在上面. activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns

  • Android 文件存储与SharedPreferences存储方式详解用法

    目录 持久化技术简介 文件存储 1. 将数据存储到文件中 2. 从文件中读取数据 SharedPreferences 存储 1. 将数据存储到 SharedPreferences 中 2. 从 SharedPreferences 中读取数据 持久化技术简介 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机的情况下,这些数据也不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在存储设备的数据是处于持久状态的.持久化技术提供了一种机制,可以让数据在瞬时状态和持久状

  • Android 文件存储系统原理

    目录 存储的可选项 存储位置的划分 内部存储空间 外部存储空间 App 私有目录 外部公共目录 系统目录 清除数据和清除缓存 清除数据 清除缓存 数据管理权限 存储的可选项 Android 的文件系统类似于其他平台的基于磁盘的文件系统.包括以下几种存储类别: App 私有的存储空间 共享的存储空间 Preferences,以 key-value 的形式存储一些原始的内容,如 SharedPreferences. 数据库 不同的存储类别扮演了不同的角色,比如 App 的私有存储空间是无法被外部访问

  • Android Binder的原理与使用

    前言 Binder是安卓中实现IPC(进程间通信的)常用手段,四大组件之间的跨进程通信也是利用Binder实现的,Binder是学习四大组件工作原理的的一个重要基础. 好多文章都会深入C代码去介绍Binder的工作流程,没点水平真的难以理解,本文不会太深入底层去剖析原理,尽可能较为简单的让大家了解Binder是怎么工作的. Binder的使用 在介绍Binder原理之前,我们先来看看在安卓中怎么使用Binder来进程间通信. 在使用之前我们先来介绍Binder的几个方法: public fina

  • 详解Android Lint的原理及其使用

    Android Lint 原理及使用详解 Android Lint 是 ADT 16中引入的新工具,用于扫描 Android 项目源中的潜在错误. Lint 是 Android 提供的一个强大的,用于静态扫描应用源码并找出其中的潜在问题的实用工具.lint 工具可以检查你的 Android 项目源文件是否有潜在的错误,以及在正确性.安全性.性能.易用性.无障碍性和国际化方面是否需要优化改进. Lint 既可以用作命令行工具,也可以与 Eclipse 和 IntelliJ 集成在一起.它被设计成独

  • 深入学习Android ANR 的原理分析及解决办法

    目录 一.ANR说明和原因 1.1 简介 1.2 原因 1.3 避免 二.ANR分析办法 2.1 ANR重现 2.2 ANR分析办法一:Log 2.3 ANR分析办法二:traces.txt 2.4 ANR分析办法三:Java线程调用分析 2.5 ANR分析办法四:DDMS分析ANR问题 三.造成ANR的原因及解决办法 四.ANR源码分析 4.1 Service造成的Service Timeout 4.2 BroadcastReceiver造成的BroadcastQueue Timeout 4.

  • 详解Android文件描述符

    介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏. 一.什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 于Linux 系统,所以Android也继承了文件描述符系统.我们都知道,在 Linux 中一切皆文件,所以系统在运行时有大量的文件操作,内核为了高效管理已被打开的文件会创建索引,用来指向被打开的文件,这个索引即是文件描述符,其表现形式为一个非负整数. 可以通过命令  ls -la /proc/$pid/fd 查看当

  • Android自定义View原理(实战)

    目录 1.为什么需要自定义View 2.自定义View的基本方法 3.自定义View的属性如何操作 4.View的视图结构 5.View的坐标系 6.View树的绘制流程 6.1 measure过程 6.2 分析自定义ViewGroup的onMeasure过程 6.3 分析自定义ViewGroup的onLayout过程 6.4 自定义Layout实战 6.5 细节 1.为什么需要自定义View Android系统内置的View不满足我们的业务需求 2.自定义View的基本方法 onMeasure

  • Android组件化原理详细介绍

    目录 什么是组件化? 为什么使用组件化? 一步步搭建组件化 1.新建模块 2.统一Gradle版本号 3.创建基础库 4.组件模式和集成模式转换 5.AndroidManifest的切换 6.*业务Application切换 组件之间的跳转 1.添加依赖 2.初始化ARouter 3.添加跳转 组件之间的数据传递 1.定义接口 2.实现接口 组件Application的动态切换 1.定义抽象类 BaseApplication 继承 Application 2.所有的组件的 Application

  • Android 文件操作详解及简单实例

     Android 文件操作详解 Android 的文件操作说白了就是Java的文件操作的处理.所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了.好了,话不多说,开始今天的正题吧. 先从一个小项目入门吧 首先是一个布局文件,这一点比较的简单,那就直接上代码吧. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt

  • Android 文件存储及常见问题解决

    Android文件存储 看下网上随处可以搜到的文件存储套路 if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ cacheDir=mContext.getExternalCacheDir().getPath(); }else { cacheDir=mContext.getCacheDir().getPath(); } fileOutputStream=new FileOutputStream(c

  • Android 文件夹显示红色叹号的解决方法(必看)

    有感叹号,说明有的文件损坏或丢失了 解决方法: 右击工程,Build Path..->Configure Build Path...->Java Build Path 可以看到引用的jar包,看看是不是带x了 不用的话就移除,要用的引用回正确路径就可以了 以上这篇Android 文件夹显示红色叹号的解决方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐