详解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 文件存储的资料请关注我们其它相关文章!

(0)

相关推荐

  • Django文件存储 默认存储系统解析

    Django默认使用的文件存储系统'django.core.files.storage.FileSystemStorage'是一个本地存储系统,由settings中的DEFAULT_FILE_STORAGE值确定. class FileSystemStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None) FileSystemStorage类继承自Storag

  • Centos7配置fastdfs和nginx分布式文件存储系统实现过程解析

    1.安装libfastcommon-1.0.43,安装包可以在大佬的https://github.com/happyfish100/libfastcommon/releases下载 [root@localhost Downloads]# tar -zxvf libfastcommon-1.0.43.tar.gz # 解压后进入目录进行编译并安装 [root@localhost libfastcommon-1.0.43]#cd libfastcommon-1.0.43 [root@localhos

  • Django文件存储 自己定制存储系统解析

    要自己写一个存储系统,可以依照以下步骤: 1.写一个继承自django.core.files.storage.Storage的子类. from django.core.files.storage import Storage class MyStorage(Storage): ... 2.Django必须可以在无任何参数的情况下实例化MyStorage,所以任何环境设置必须来自django.conf.settings. from django.conf import settings from

  • Android开发实现文件存储功能

    本文实例为大家分享了Android开发实现文件存储的具体代码,供大家参考,具体内容如下 这个程序只有一个Activity, Activity中只有一个Edittext.实现的功能是在Activity销毁之前将EditText的内容存储到一个文件中,在Activity创建的时候,从该文件中读取内容并写道EditText中.代码如下,在onCreate加载数据,在onDestroy中保存数据. MainActivity.kt package com.example.filetest import a

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

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

  • 详解Android 中的文件存储

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

  • 详解Android中fragment和viewpager的那点事儿

    在之前的博文<Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果>和<详解Android中Fragment的两种创建方式>以及<Android中fragment与activity之间的交互(两种实现方式)>中我们介绍了ViewPager以及Fragment各自的使用场景以及不同的实现方式. 那如果将他们两结合起来,会不会擦出点火花呢,答案是肯定的.之前在介绍ViewPager时,我们实现了多个ImageView的切换,并配合更新导航原点的状态.那我

  • 详解Android中Intent对象与Intent Filter过滤匹配过程

    如果对Intent不是特别了解,可以参见博文<详解Android中Intent的使用方法>,该文对本文要使用的action.category以及data都进行了详细介绍.如果想了解在开发中常见Intent的使用,可以参见<Android中Intent习惯用法>. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 一.概述 我们知道,Intent是分两种的:显式Intent和隐式

  • 详解Android中图片的三级缓存及实例

    详解Android中图片的三级缓存及实例 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络.本地.内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

  • 详解Android中的Service

    Service简介: Service是被设计用来在后台执行一些需要长时间运行的操作. Android由于允许Service在后台运行,甚至在结束Activity后,因此相对来说,Service相比Activity拥有更高的优先级. 创建Service: 要创建一个最基本的Service,需要完成以下工作:1)创建一个Java类,并让其继承Service 2)重写onCreate()和onBind()方法 其中,onCreate()方法是当该Service被创建时执行的方法,onBind()是该S

  • 详解Android 中AsyncTask 的使用

    详解Android 中AsyncTask 的使用 1.首先我们来看看AsyncTask 的介绍:   Handler 和 AsyncTask 都是android 中用来实现异步任务处理的方式:其中: Handler 实例向 UI 线程发送消息,完成界面更新, 优点:对整个过程控制的比较精细:         缺点:代码相对臃肿,多个任务同时执行时,不易对线程进行精确的控制: AsyncTask :比Handler 更轻量级一些,适用于简单的异步处理: 优点:简单 | 快捷 | 过程可控:    

  • 详解Android中Service AIDL的使用

    目录 前言 Service基本用法--本地服务 远程服务 -- AIDL 服务端 客户端 前言 有些朋友可能是从事开发工作的时间不是特别的长,所以觉得Service相对与另外两个组件activity.broadcast receiver来说,使用可能并不是特别的多,所以对Service来说,理解不是特别的深入,只是有一个大概的概念,今天就和一块来走一下Service,希望能够帮助到大家对Service有更深入的理解. Service基本用法--本地服务 我们知道服务分为本地服务和远程服务,而本地

  • 详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题

    详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题 今天在项目中实现了一个效果,主要是画一个圆.为了后续使用方便,将这个圆封装在一个自定义Actor(CircleActot)中,后续想显示一个圆的时候,只要创建一个CircleActor中即可. 部分代码如下所示: package com.ef.smallstar.unitmap.widget; import android.content.res.Resources; import

  • 详解Android中Handler的内部实现原理

    本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文<详解Android中Handler的使用方法>,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解. 概括来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制.我们在使用Handler的时候与Message打交道最多,Message是Hanlder机制向开发人员暴露出来的相关类,可以通过Message类完成大部分操作Handler的功

  • 详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os.getcwd()) Current directory is D:\Python36 2.代码2 如果将上面的脚本写入到文件再运行 Current directory is E:\python\work 二 获得目录的内容 Python代码 >>> os.listdir (os.getcwd

随机推荐