`
ipjmc
  • 浏览: 708048 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android文件存储

阅读更多
Internal Storage内部存储空间

        所谓的内部存储与外部存储,是指是否是手机内置。手机内置的存储空间,称为内部存储,它是手机一旦出厂就无法改变,它也是手机的硬件指标之一,通常来讲手机内置存储空间越大意味着手机价格会越贵(很多地方把它称为手机内存,但我们做软件的知道,这并不准确,内存是指手机运行时存储程序,数据和指令的地方;这里应该是手机内部存储的简称为内存,而并非严格意义上的内存)。

        内部存储空间十分有限,因而显得可贵,所以我们要尽可能避免使用;另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。上面所谈到的Shared Preferences和下面要谈到的SQLite数据库也都是存储在内部存储空间上的。

        Android本身来讲是一个Linux操作系统,所以它的内部存储空间,对于应用程序和用户来讲就是“/data/data"目录。它与其他的(外部的存储)相比有着比较稳定,存储方便,操作简单,更加安全(因为可以控制访问权限)等优点。而它唯一的缺点就是它比较有限,比较可贵。

        虽然,可以非常容易的知道程序本身的数据所在路径,所有的应用程序的数据路径都是“/data/data/app-package-name/”,所有的程序用到的数据,比如libs库,SharedPreferences都是存放在这个路径下面。但我们在使用的时候最好不要,或是千万不要直接引用这个路径。

        使用内部存储主要有二个方式,一个是文件操作,一个是文件夹操作。无论哪种方式,Context中都提供了相应的函数来支持,使用Context不但操作简单方便,最重要的是Context会帮助我们管理这些文件,也可以方便帮助我们控制文件的访问权限。先来系统的说下Context中关于文件和文件夹操作的函数有哪些。

        a. 创建一个文件,并打开成一个文件输出流,需要提供一个String,作为文件名

FileOutputStream  output = Context.openOutputFile(filename, Context.MODE_PRIVATE);
output.write(data);// use output to write whatever you like
output.close();


       b.  同样,想打开一个文件作为输入的话,也是只需要提供文件名
FileInputStream input = Context.openInputFile(filename);
input.read();
input.close();


       c.  列出所有的已创建的文件
String[] files = Context.fileList();
for (String file : files) {
	Log.e(TAG, "file is " + file);
}

        d.  删除文件,能创建就要能够删除,当然也会提供了删除文件的接口,它也非常简单,只需要提供文件名
if (Context.deleteFile(filename)) {
    Log.e(TAG, "delete file " + filename + " sucessfully“);
} else {
    Log.e(TAG, "failed to delete file " + filename);
}


        e.  获取文件已创建文件的路径,它返回一个文件对象用于操作路径
File fileDir = Context.getFileDir();
Log.e(TAG, "fileDir " + fileDir.getAbsolutePath();


        f.  创建一个目录,需要传入目录名称,它返回 一个文件对象用到操作路径
File workDir = Context.getDir(dirName, Context.MODE_PRIVATE);
Log.e(TAG, "workdir " + workDir.getAbsolutePath();


       g. 以File对象方式查看所创建文件,需要传入文件名,会返回文件对象
File store = Context.getFileStreamPath(filename);
Log.e(TAG, "store " + store.length());


        h. 获取Cache路径,无需要传入参数,返回文件对象
File cachedir = Context.getCacheDir();
Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath());

 
        总结一下文件相关操作,可以得出以下三个特点:
        1. 文件操作只需要向函数提供文件名,所以程序自己只需要维护文件名即可;
        2. 不用自己去创建文件对象和输入、输出流,提供文件名就可以返回File对象或输入输出流

        3. 对于路径操作返回的都是文件对象。

        如前所述,内部存储空间有限,可贵,安全,稳定,所以应该用来保存比较重要的数据,比如用户信息资料,口令秘码等不需要与其他应用程序共享的数据。也可以用来创建临时文件,但一定要注意及时删除。另外,对于内部存储还有一个非常重要的特点,那就是在应用程序被卸载时,应用程序在内部存储空间的文件数据将全部被删除。系统这样做的原因很简单,就是因为内部存储很有限,它必须保证它的可用性,因为一旦添满,系统将无法再正常工作。

        External Storage外部存储空间
        再来谈谈手机外部存储空间,与内部存储空间相对,外部存储空间是指手机出厂的时候不存在,用户在使用时候可以自由添加的外部存储介质比如TS卡,SD卡等闪存储介质。这些闪存介质由最初的空间小价格贵,到现在的大容量价格便宜,所以几乎每个支持外部存储的手机上面都有大容量(大于等于2G)的闪存卡。

        Android也是不例外,它完全支持外部存储介质。其实更确切的说,它是要依赖于外部存储卡的,因为对于Android系统,如果没有外部存储卡,很多的系统应用无法使用,比如多媒体相关的应用程序无法使用。虽然Android很依赖,但是外部存储卡也有它自身的特点,它最大的优点就是存储空间大,基本上你可无限制的使用,也不怎么担心去清除数据。就目前来看,很多程序都在使用外部存储卡,但很少有程序去主动清理数据,所以无论你的SD卡有多大,它的可用空间却越来越少。与内部存储不同的是,当程序卸载时,它在外部存储所创建的文件数据是不会被清除的。所以清理外部存储空间的责任丢给了用户自己,每隔一段时间就去查看下SD卡,发现无用数据立马删除。外部存储的缺点就是不是很稳定,对于Android手机来讲可以说,很不稳定,本身闪存介质就容易出问题,SD卡处于不能正常使用的状态十分多。

        先来说说外部存储相关的使用方法和API:
        a. Check media availability检查介质的可用性
        如前所述,外部存储介质的稳定性十分的差,所以在使用之前一定要先检查它的可用性,如果可用再去用

final String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us 


        b. Get the directory获取外部存储卡的路径
        事实上,外部存储卡的路径是“/mnt/sdcard",所以你直接这样写去访问也能访问的到。鉴于可读性和可移植性的考虑,建议这样写:

File sdcardDir = Environment.getExternalStorageDirectory();


        c. For API 8 or greater, there are some other useful APIs helping to manager files and directories.
        如果你使用API 8(Android 2.2)或者更高,那么SDK中又多了几个操作外部存储文件和路径的接口,文档中也建议开始者更加规范的使用SD卡。比如,创建相应的目录去存储相应的数据,Music,Picture,Video等。应用程序目录也变成了"/Android/data/package-name/data"。具体的使用可以参考文档,这里不重复。当然,就像编程规范一样,这里只是规范,你完全可以不遵守它,但出于可读性和可移植性,还是建议按照文档建议的去做。

        下面总结一下使用时应该注意的一些和外部存储的特点:

        a. 外部存储卡不是随时想用就能够用的,所以一定要记得在使用之前检查它的可用性

        b. 存储在外部存储卡上的数据是所有应用程序都可见,用户也可见(使用FileManager),所以安全性不是很好,虽然文档声称可以在外部存储卡上写程序私有数据,但貌似没用,用FileManager仍然可以删除或编辑文件(Market上面的FileManager功能都十分的强大,能让用户看到SD卡中的所有文件,和操作能看到的文件)。

        c. Android手机支持把外部存储卡Mount至PC做为U盘,当连接数据线时,这时SD卡变成了U盘连接到了另外的操作系统中。什么意思,就是在Android当中虽然有的文件属性(隐藏,私有等),到了PC上就不一定管用了,用户在PC上可以随意操作文件(这就是第二点中所提及的)。

        d. 如果使用外部存储卡保存数据,一定要额外做好异常处理:外部存储卡不可用时把数据存入哪里;可用的时候再怎么同步数据(这是比较头疼的地方,可行的做法就是当SD卡不可用时不准用户写数据,但这用户体验又不是很好,但如你所知,很多应用都这么干);你的数据被破坏了。当然常见的异常也要考虑,比如空间满了,无法写入,磁盘坏道等。
我们还可以看一下常见的文件目录:
别忘了权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Log.i(TAG, "getFilesDir = " + getFilesDir());
Log.i(TAG, "getExternalFilesDir = " + getExternalFilesDir("exter_test").getAbsolutePath());
Log.i(TAG, "getDownloadCacheDirectory = " + Environment.getDownloadCacheDirectory().getAbsolutePath());
Log.i(TAG, "getDataDirectory = " + Environment.getDataDirectory().getAbsolutePath());
Log.i(TAG, "getExternalStorageDirectory = " + Environment.getExternalStorageDirectory().getAbsolutePath());
Log.i(TAG, "getExternalStoragePublicDirectory = " + Environment.getExternalStoragePublicDirectory("pub_test"));


执行结果如下:

  • 大小: 8.7 KB
分享到:
评论
2 楼 jiduoduo 2016-02-18  
整理的不错!
1 楼 lufengdie 2012-09-07  


不错不错! 似乎不能转发只能收藏!

相关推荐

    android 文件存储

    在Android系统中,文件存储是应用开发中必不可少的一部分。它涉及到如何有效地管理应用程序的数据,包括保存用户设置、缓存图片、记录日志等。本文将深入探讨Android中的文件存储机制,包括内部存储、外部存储、...

    Android不需要文件存储权限将文件保存至手机

    在Android系统中,传统的文件存储方式通常需要应用获取相应的文件读写权限,以便在外部存储(如SD卡)上保存和访问数据。然而,随着Android系统的更新,特别是自Android 6.0(Marshmallow)引入运行时权限管理以来,...

    android文件存储源码及笔记

    在Android系统中,文件存储是应用开发中必不可少的一部分。它涉及到如何有效地管理应用程序的数据,包括保存用户设置、缓存文件、数据库记录等。本资源"android文件存储源码及笔记"提供了一个名为`SDCardHelper`的...

    android文件保存

    在Android开发中,数据保存是不可或缺...总的来说,Android中的文件保存涉及`File`和`SharedPreferences`的选择,以及存储位置的决策。开发者应根据具体需求和数据特性来选择合适的方法,同时注意权限管理和数据安全。

    android文件存储

    在Android应用开发中,文件存储是一种常见的数据持久化方法,尤其适用于存储小量的数据,例如...通过理解并熟练运用上述知识,开发者可以在Android应用中有效地实现文件存储功能,为用户提供稳定的数据保存和恢复体验。

    安卓学习FilePersistence实现安卓文件存储和文件读取

    首先,我们要理解Android的文件存储机制。Android提供了多种存储方式,包括内部存储、外部存储、SQLite数据库和SharedPreferences。在`FilePersistenceTest`项目中,我们将重点探讨内部存储和外部存储的使用。 1. *...

    Android本地数据存储之文件存储读写

    本文将深入探讨Android系统中的文件存储机制,包括如何读取、写入、重写和删除.txt格式的文件。理解这些知识点对于任何Android开发者来说都极其必要。 一、Android文件存储基础 Android提供了多种本地数据存储方式...

    android txt文件保存读取操作

    在Android平台上,对TXT文件进行保存和读取是常见的数据持久化操作,尤其适用于存储少量结构化的文本数据。本文将详细讲解如何在Android应用中实现TXT文件的保存和读取功能,以及涉及到的相关知识点。 首先,我们...

    安卓学习SharedPreferences实现安卓文件存储

    在这个名为"FilePersistenceTest"的项目中,我们将探讨如何使用SharedPreferences来实现安卓文件存储。 SharedPreferences的工作原理是基于XML文件,这些文件存储在设备的内部存储区域,通常是`/data/data/包名/...

    Android-sklad一个Android文件存储库加密和流媒体支持

    **Android-sklad:Android文件存储库加密与流媒体支持** `Android-sklad` 是一个专门为Android平台设计的文件存储库,它提供了强大的文件管理功能,包括加密和流媒体支持。这个开源库旨在帮助开发者更高效、安全地...

    Delphi XE10.1.2 Android 文件选择保存对话框

    在本文中,我们将深入探讨如何在Delphi XE10.1.2环境中实现一个Android平台上的文件选择和保存对话框。Delphi是一款强大的RAD(快速应用开发)工具,允许开发者使用Object Pascal语言构建跨平台的应用程序,包括...

    Android 3种数据保存(SharedPreferences存储 内部文件存储 数据库存储)

    本教程将详细介绍Android中的三种主要数据存储方式:SharedPreferences存储、内部文件存储以及数据库存储。 1. SharedPreferences存储 SharedPreferences是Android提供的一种轻量级的数据存储方式,用于保存应用...

    Android案例:备忘录。利用数据存储的文件内部存储

    - Android提供了多种数据存储方式,如SharedPreferences、SQLite数据库、文件存储、ContentProvider以及网络存储等。在这个案例中,我们主要关注的是文件内部存储,适合于存储小量的非结构化数据。 2. **文件内部...

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

    "Android存储字符串数据到txt文件" Android存储字符串数据到txt文件是Android开发中的一种常见需求,对于大多数开发者来说,存储字符串数据到txt文件是一种非常有用的功能。今天,我们将详细介绍如何在Android中...

    android webview实现自身下载文件自动保存SDCARD

    而“android webview实现自身下载文件自动保存SDCARD”这个话题则涉及到如何在WebView中处理文件下载,并且让这些文件自动保存到设备的外部存储(通常是SDCARD)中,而且整个过程对用户来说是透明的,即静默下载。...

    android文件系统浏览器

    其中,SDCard是Android设备用于扩展存储空间的外部存储区域,通常用来存放用户数据和应用文件。 Android文件系统浏览器的首要任务是提供一个图形化的界面,使用户能够查看和管理SDCard上的文件和文件夹。这包括浏览...

    Android文件存储方式之openFileOutput与获取数据

    在Android应用开发中,文件存储是一项基础且重要的任务,它涉及到数据持久化,使得应用程序在关闭后仍能保存用户的数据或状态。本篇文章主要探讨的是Android中的`openFileOutput()`方法以及如何通过它来存储和读取...

    安卓开发文件存储教程

    安卓开发文件存储教程 本教程旨在指导用户如何在安卓开发中实现文件存储,涵盖了文件存储的基本概念、String.xml文件的编写、布局管理的实现、MainActivity中的代码编写等方面的知识点。 一、文件存储的基本概念 ...

Global site tag (gtag.js) - Google Analytics