浅析Android文件存储

一、内部存储

内部存储,位于data/data/包名/路径下

是否需要用户权限:否

是否能被其他应用访问:否

卸载应用数据是否被删除:是

内部存储控件不需要用户权限,这意味着我们不需要用户去授权下面的权限:

android.permission.WRITE_EXTERNAL_STORAGE

android.permission.READ_EXTERNAL_STORAGE

对于设备中每一个安装的 App,系统都会在 data/data 目录下以应用程序包名自动创建与之对应的文件夹,可以直接读写该目录下的文件。而且该目录下的文件不能被其他应用访问。这也就保证了我们应用内部存储的文件的安全性和隐私性,如果我们需要查看自己应用内部的文件,我们可以通过 Android Studio的Device File Explore工具进行访问:

通过这个,可以查看对应应用的存储文件。

/data/data/应用名/cache :存放的是APP的缓存信息

/data/data/应用名/code_cache :在运行时存放应用产生的编译或者优化的代码

/data/data/应用名/files : 存放APP的文件信息

还有一些运行时,产生的文件夹,例如调用 SharedPreference 所产生的 /data/data/应用包名/shared_prefs 目录,存放着 app 的 SharedPreference 所产生的 xml 文件,还有调用数据库所产生的 **/data/data/应用包名/databases/** 文件夹,这里就不一一举例。

从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他 app 能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences 和 SQLite 数据库都是存储在内部存储空间上的。内部存储一般用 Context 来获取和操作。
访问内部存储的API方法:

1.getFilesDir().getAbsolutePath() :/data/user/0/com.example.myapplication/files

2.getCacheDir().getAbsolutePath() :/storage/emulated/0/Android/data/com.example.myapplication/cache

3.getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() :/data/user/0/com.example.myapplication/app_myfile

4.getCodeCacheDir().getAbsolutePath() : /data/user/0/com.example.myapplication/code_cache ,要求Android5.0+

二、外部存储

概念:最容易混淆的是外部存储,因为老的 Android 系统的跟新的 Android 系统是有差别的,很多人去网上查找资料,看了一下以前的资料,又看了一下现在的资料,但是发现它们说法不一样然后就困惑了。

首先说一个大家普遍的概念 "如果在 pc 机上是区分外部存储和内部存储的话,那么电脑自带的硬盘算是内部存储,U盘或者移动硬盘就是外部存储了。" 因此很多人带着这样的理解去看待安卓手机,把内置存储(机身存储)当做内部存储,而把扩展的 SD 卡当做是外部存储。

这么认为确实没错,因为在 4.4(API19)以前的手机上确实是这样的,手机自身带的存储卡就是内部存储,而扩展的SD卡就是外部存储。

但是从 4.4 的系统开始,很多的中高端机器都将自己的机身存储扩展到了 8G 以上,比如有的人的手机是 16G 的,有的人的手机是 32G 的,但是这个 16G,32G 是内部存储吗,不是的,它们依然是外部存储。

也就是说 4.4 系统及以上的手机将机身存储存储(手机自身带的存储叫做机身存储)在概念上分成了 "内部存储internal" 和 "外部存储external" 两部分。既然 16G,32G 是外部存储,那有人又有疑惑了,那 4.4 系统及以上的手机要是插了 SD 卡呢,SD 卡又是什么呢,如果 SD 卡也是外部存储的话,那怎么区分机身存储的外部存储跟 SD 卡的外部存储呢?

对,SD卡也是外部存储,那怎么区分呢,在4.4以后的系统中,API提供了这样一个方法来遍历手机的外部存储路径:

File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
    for(File file:files){
        Log.e("main",file);
    }
}

如果你的手机插了SD卡的话,那么它打印的路径就有两条了,例如我的华为荣耀 7 插了SD卡,它的结果如下:

/storage/emulated/0/Android/data/packname/files/mounted

/storage/B3E4-1711/Android/data/packname/files/mounted

其中 /storage/emulated/0 目录就是机身存储的外部存储路径,而 /storage/B3E4-1711/ 就是 SD 卡的路径,他们统称为外部存储。

一般对于外部存储可以分为两类,外部公有和外部私有。

2.1、外部公有

是否需要用户权限:是

是否能被其他应用访问:是

卸载应用数据是否被删除:否

公共目录必须需要用户授权读写的权限,这意味着我们需要在AndroidManifest.xml中注册用户权限。

<!-- 外部存储写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

并且在 Android 6.0 系统之后需要申请用户权限,并获得用户授权,才能读写文件。

公共目录相对开放,我们可以访问其他APP存在公共目录下的文件,并且当 APP 被删除时,并不会删除应用存在公共目录下的文件。

我们可以通过 Environment 对象,访问读写公共目录的文件。

在对外部存储进行读写的时候,应该先判断一下外部存储的状态,是否能够支持读写。

Environment.getExternalStorageState()
/**       {@link #MEDIA_UNKNOWN}, {@link #MEDIA_REMOVED},
 *        {@link #MEDIA_UNMOUNTED}, {@link #MEDIA_CHECKING},
 *        {@link #MEDIA_NOFS}, {@link #MEDIA_MOUNTED},
 *        {@link #MEDIA_MOUNTED_READ_ONLY}, {@link #MEDIA_SHARED},
 *        {@link #MEDIA_BAD_REMOVAL}, or {@link #MEDIA_UNMOUNTABLE}
 */

只有在返回值为MEDIA_MOUNTED 表示当前是可正常读写的。

接下来让我们看看相关的API。

1. Environment.getExternalStorageDirectory() : /storage/emulated/0

2. Environment.getExternalStoragePublicDirectory(String type)  

Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).getAbsolutePath()  : /storage/emulated/0/Documents

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath() : /storage/emulated/0/Music

2.2、外部私有

是否需要用户权限:4.4以上不需要

是否能被其他应用访问:否

卸载应用数据是否被删除:是

私有目录,在 Android4.4 系统以上。不需要注册和用户授权外部私有存储的读写的权限,就可以在应用的外部私有进行读写文件。并且文件不能被其他应用所访问,具有较好的隐私性和安全性,并且在用户删除的时候,对应的应用私有目录也会被删除。

私有目录地址:/storage/emulated/0/Android/data/应用包名

相关API如下:

getExternalCacheDir().getAbsolutePath()  // /storage/emulated/0/Android/data/com.example.myapplication/cache

getExternalFilesDir("mytest").getAbsolutePath() // /storage/emulated/0/Android/data/com.example.myapplication/files/mytest

getExternalFilesDir(null).getAbsolutePath()  // /storage/emulated/0/Android/data/com.example.myapplication/files

以上就是浅析Android文件存储的详细内容,更多关于Android文件存储的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android实现文件存储并读取的示例代码

    要求: 输入文件名,文件内容分别存储在手机内存和外存中,并且都可以读去取出来. 步骤: 1.创建一个名为CDsaveFile的Android项目 2.编写布局文件activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layo

  • android数据存储之文件存储方法

    文件存储是 Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动的保存到文件当中的. 概述 文件存取的核心就是输入流和输出流. Android文件的操作模式 文件的相关操作方法 文件读写的实现 openFileOutput和openFileInput方法 /** * openFIleOutput ,openFileInput * 这两种方法同sp一样只能讲文件保存到手机内存固定的路径中, * 默认为 /data/data/<packageName

  • 实例详解Android文件存储数据方式

    总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.下面通过本文给大家介绍Android文件存储数据方式. 1.文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方法. 创建的存储文件保存在/data/data/<package name>/files文件夹下. 2.操作. 保存文件内容:通过Context.openFileOutput获取输出流,参数分别为文件名和存储模式. 读取文件内容:通

  • Android编程之SharedPreferences文件存储操作实例分析

    本文实例讲述了Android编程之SharedPreferences文件存储操作的方法.分享给大家供大家参考.具体分析如下: SharedPreferences类提供了一种简单的文件存储功能,像程序的配置文件可以通过它来实现. 源代码: package com.test.sharedpreferences; import android.app.Activity; import android.content.Context; import android.content.SharedPrefe

  • Android学习之文件存储读取

    前言 相信大家都知道知道,在AndroidOS中,提供了五中数据存储方式,分别是:ContentProvider存储.文件存储.SharedPreference存储.SQLite数据库存储.网络存储.那么这一篇,我们介绍文件存储. 1.Android文件的操作模式 学过Java的同学都知道,我们新建文件,然后就可以写入数据了,但是Android却不一样,因为Android是 基于Linux的,我们在读写文件的时候,还需加上文件的操作模式,Android中的操作模式如下: 2.文件的操作模式 我们

  • 详解Android文件存储

    摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者在这部分感到很容易混淆内部存储和外部存储两个概念. 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者在这部分感到很容易混淆内部存储和外部存储两个概念. 相

  • android开发基础教程—文件存储功能实现

    文件存储: 复制代码 代码如下: public class MainActivity extends Activity { EditText mname, mage; TextView mtv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mname = (Edit

  • Android用文件存储数据的方法

    本文实例为大家分享了Android用文件存储数据的具体代码,供大家参考,具体内容如下 存储数据示例: private void saveFileData() { BufferedWriter writer = null; try { FileOutputStream out = openFileOutput("data", MODE_PRIVATE);//保存的文件名为"data" writer = new BufferedWriter(new OutputStre

  • 详解Android开发数据持久化之文件存储(附源码)

    其实我们在社交网络上面所发出的任何信息, 都希望能够保留下来. 那么如何实现呢? 数据持久化 数据持久化, 就是将内存中的瞬时数据保存在存储设备中, 保证即便关机之后, 数据仍然存在. 保存在内存中的数据是瞬时数据, 保存在存储设备中的数据就是处于持久状态的. 持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换, Android系统中主要提供了3种方式用于简单地实现数据持久化功能, 即文件存储, SharePreference存储, 以及数据库存储. 当然你也可以将数据保存在

  • 详解Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以往直接sdcard根目录上直接新建了一个xxx/cache/目录来做文件存储就会不是那么容易控制了,所以有必要重新认识一下Android文件存储的相关知识了. 背景: 有关外置sdcard的读写权限 <uses-permission android:name="android.permissi

随机推荐