Android数据保存之文件保存

前言:

上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,而且是以key-value形式保存的String类的信息,比較有局限性。

比方你须要保存从网络获取的图片到本地作为缓存数据,而且数量比較大。SharedPreferences就不能满足你的需求了,这个时候就要用到基本上全部平台都会用到的文件保存。

Android中以文件形式把数据保存到磁盘上与其它平台基本上都是类似的。本篇文章将会介绍怎样利用java.io.Files的API函数进行文件的读写操作。

选择内部存储还是外部存储:

全部的Android设备有两个文件存储区域:“内部”和“外部”存储。这些名字来自Android的早期。那时大多数设备提供了内置的非易失性存储器(内存)。加上一个可移动的存储介质如micro SD卡(外部存储)。如今的Android设备基本上内置的存储空间都非常大,比方16g或者32g。这里的16g和32g是指的总共磁盘大小,相当于你新买的电脑一块崭新的硬盘。在手机出厂的时候会在这块磁盘上烧上android系统,android系统会把整个磁盘进行分区。一部分提供给android系统存放系统文件使用,类似windows的系统盘,可是要比windows上权限严格的多。用户是不能任意訪问这部分文件的(root除外),这一部分叫做内部存储,剩余的部分用户能够自由使用。手机连上电脑时查看到的也仅仅是这部分文件。叫做外部存储。相当于windows上的其它磁盘(比方D盘),当然有的用户又加入了一张micro-SD卡。这部分也算做外部存储,相当于windows上的外接硬盘吧。

内部存储和外部存储是有差别的。在利用的时候须要注意他们各自的特点:

内部存储:

  • 始终存在可用;
  • 保存的文件默认仅仅能被保存文件的app訪问,各个应用之间不能够彼此訪问,仅仅能訪问自己保存的文件。
  • 当应用被卸载的时候应用保存的文件会被全然清除掉。
  • 假设你想要保存的文件非常安全,不会被用户和其它应用读取到,那么你能够选择内部存储这样的方式。

外部存储:

  • 不一定存在,比方有的手机出厂是仅仅有内部存储,没有外部存储,用户自己又没有安装micro-SD卡,这时外部存储是不可用的。
  • 读写全然开放的,所以你保存的数据可能会被用户和可其他程序读取;
  • 卸载应用时仅仅会删除通过getExternalFilesDir()获取到的文件夹文件;
  • 假设你的文件没有必要控制訪问权限,能够同意其他应用或者用户查看,那么外部存储是不错的选择;

注:在默认情况下应用程序安装到内部存储,您能够指定android:installLocation属性在AndroidManifest.xml文件里,这样你的应用程序能够安装在外部存储器。

对于用户来说有这个安装选项很有用,当一些应用程序很大,内部存储空间不足的时候用户能够把应用安装到外部存储空间。

获取外部存储权限:

要想在外部存储上存储文件首先要获取外部存储读写权限,权限的声明都是在AndroidManifest.xml文件里,代码例如以下:

<manifest ...>
    <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    ...
</manifest>

注意:如今全部的应用程序默认都有外部存储的读取权限,你不须要在AndroidManifest.xml文件里进行声明。可是这样的默认的权限可能会在以后的Android版本号中变更。所以不妨要在AndroidManifest中显式的进行读取权限声明,免得在以后的版本号中程序出现故障,读取权限声明例如以下:

<manifest ...>
    <uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
    ...
</manifest>

另外:

1、写入权限隐含就有读取权限;

2、内部存储不须要进行权限声明,应用程序对于内部存储默认就有读写文件的权限;

保存到内部存储:

文件存储须要创建文件。当把文件保存到内部存储时你能够获取内部存储文件通过以下的两个方法:

1、File getFilesDir ();

返回一个文件文件夹。这个文件夹下保存应用程序的数据,通过 openFileOutput(String, int) 创建的文件都保存在这个文件文件夹下。

这个文件夹大概是:data/data/包名/files,比方豌豆荚应用程序是:data/data/com.wandoujia.phoenix2/files/

2、File getCacheDir ();

返回一个文件文件夹,这个文件夹存放的是应用程序缓存文件,当系统空间不足时这部分文件首先会被删除。

这个文件夹大概是:data/data/包名/cache。比方豌豆荚应用程序是:data/data/com.wandoujia.phoenix2/cache/

注意:缓存文件的删除不应该依赖系统去删除它,最好的办法是给你的应用缓存设置一个最大值,比方1M,当达到这个值时你应该去删除部分缓存文件以便能再次利用这部分空间。

当你想要在内部存储写入一个文件时,首先要创建一个文件,能够通过File的构造器。传入上面两个方法获取的路径作为參数,非常方便的就能创建一个文件。比如:

File file = newFile(context.getFilesDir(), filename);

然后再通过上面的file创建文件流。写入文件。当然你可能更喜欢以下的方式,通过调用 openFileOutput() 创建一个FileOutputStream 。然后写入文件,代码例如以下:

String filename ="myfile";
Stringstring="Hello world!";
FileOutputStream outputStream;

try{
  outputStream = openFileOutput(filename,Context.MODE_PRIVATE);
  outputStream.write(string.getBytes());
  outputStream.close();
}catch(Exception e){
  e.printStackTrace();
}

当你须要创建一个缓存文件时,你能够通过以下的方式:

File file = newFile(context.getCacheDir(), filename);

或者。你会更喜欢以下的方式。通过File的creatTempFile方法在cache文件夹创建暂时文件,文件的后缀是.tmp:

publicFile getTempFile(Context context,String url){
    File file;
    try{
        String fileName =Uri.parse(url).getLastPathSegment();
        file =File.createTempFile(fileName,null, context.getCacheDir());
    catch(IOException e){
        // Error while creating file
    }
    return file;
}

注意:通常情况下你的应用程序内部存储文件是不会被其它应用程序訪问到的。由于其它程序的訪问首先须要知道你应用的包名和文件名称,其次须要获取到你这个文件的訪问权限。

从技术上来说假设你存放的文件开放了文件读取权限其它应用程序就能读取到,除非是你把文件设置为可读写的,要不然其它程序是无法读取你的文件的,所以文件权限Context.MODE_PRIVATE是必须要设置的。

保存到外部存储:

保存到外部存储首先要检查外部存储是否存在并有剩余空间,由于外部存储有可能会被拔掉。或者正在连接着电脑,所以当你要在外部存储保存文件的第一步就是检查外部存储是否挂在,能够通过调用getExternalStorageState()方法来查看外置存储是否挂载,假设返回状态是Environment.MEDIA_MOUNTED。则表明已经挂在,而且能够读写。比如以下的代码:

/* Checks if external storage is available for read and write */
publicboolean isExternalStorageWritable(){
    String state =Environment.getExternalStorageState();
    if(Environment.MEDIA_MOUNTED.equals(state)){
        returntrue;
    }
    returnfalse;
}

/* Checks if external storage is available to at least read */
publicboolean isExternalStorageReadable(){
    String state =Environment.getExternalStorageState();
    if(Environment.MEDIA_MOUNTED.equals(state)||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
        returntrue;
    }
    returnfalse;
}

虽然外部存储的文件能够被用户和其它程序訪问,可是对于外部存储的文件你须要分两类对待:

public files:

这类文件是全然开发的。对于其它应用程序或者用户都能够訪问。当你的应用被卸载的时候这部分文件也不会被删除。比方你的拍照程序。用户拍的照片不会由于用户卸载了应用而删除照片,还比方看视频软件,用户下载下来的视频也不能由于卸载二删除。

private files:

这类文件属于你的应用程序专有,对于其它应用程序无法使用,也没有不论什么利用价值。尽管这部分文件对用户和其它程序是开放的。这类文件在应用卸载的时候应该被删掉。要不然会造成用户空间的浪费,比方一些缓存文件,地图资源等。

假设你想保存一个公用的文件到外部存储,你能够通过Environment.java中的:

public static File getExternalStoragePublicDirectory (String type)方法获取外部存储的公共文件夹,公共文件夹有几种类型,依据你输入的type返回不同的文件夹,type类型有:

public static String DIRECTORY_ALARMS 标准的铃声文件夹
public static String DIRECTORY_DCIM 相机拍照或录像文件的存储文件夹
public static String DIRECTORY_DOWNLOADS 下载文件夹
public static String DIRECTORY_MOVIES 电影文件夹
public static String DIRECTORY_MUSIC 音乐文件夹
public static String DIRECTORY_NOTIFICATIONS 提示音文件夹
public static String DIRECTORY_PICTURES 图片文件夹
public static String DIRECTORY_PODCASTS 播客文件夹
public static String DIRECTORY_RINGTONES 铃声文件夹

大家最常见的DIRECTORY_PICTURES文件夹是:/mnt/sdcard/Pictures。比方你想要存储一张图片,要在外部存放图片的公共文件夹创建一个图片文件:

publicFile getAlbumStorageDir(String albumName){
    // Get the directory for the user‘s public pictures directory.
    File file =newFile(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
    if(!file.mkdirs()){
        Log.e(LOG_TAG,"Directory not created");
    }
    return file;
}

假设你想要保存私有类型的数据到外部存储上,能够通过调用Context.java中的:

public abstract File getExternalFilesDir (String type) 方法获取外部存储路径,路径是:

/mnt/sdcard/Android/data/data/your_package/type  ,type同上,依据你想要保存的文件类型选择。以下是创建存放私有图片文件的样例:

publicFile getAlbumStorageDir(Context context,String albumName){
    // Get the directory for the app‘s private pictures directory.
    File file =newFile(context.getExternalFilesDir(
            Environment.DIRECTORY_PICTURES), albumName);
    if(!file.mkdirs()){
        Log.e(LOG_TAG,"Directory not created");
    }
    return file;
}

假设type中没有你须要的类型,你能够输入null。此时返回的是你的应用程序外部存储文件夹的私有文件夹的根文件夹。

注意:通过getExternalFilesDir(String type) 方法创建的文件在用户清除数据或者在应用卸载的时候会被系统清除掉。getExternalStoragePublicDirectory(String type) 方法创建的文件则不会。另外,不管你用哪一种方法创建应用程序外部存储文件。注意一下type类型的正确性,以便于系统处理的时候可以正确处理,比方你保存的一个文件是铃声类型,在DIRECTORY_RINGTONES下。系统MediaScanner在进行多媒体扫描的时候会把这个文件分类为铃声而不是音乐。

查询剩余空间:

假设你提前知道你要保存的文件大小。你就行通过File.getFreeSpace()或者File.getTotalSpace()方法来估算存储空间是否可以容纳。这样就行避免在没有足够的存储空间时出现IOException。然而有的时候通过File.getFreeSpace()获取的可用空间不一定就有那么多供你使用,假设通过File.getFreeSpace()获取的大小比你的文件大几M或者文件系统有大于10%的剩余空间,这时保存文件可能可以正常进行,否则可能就会保存失败。

注意:在你保存文件之前,你不须要检查可用空间。而是在写入文件的时候捕获IOException,用这样的方法来取代空间大小的检查。假设你不知道你须要多少空间。

删除文件:

当你不再须要一个文件时你须要删除它,最直接的方法就是直接调用File.delete()方法来删除。假设这个文件被保存在内部存储上。你也能够调用Context.deleteFile(String name)方法类删除文件。

在用户卸载你的应用的时候Android系统会删除你的一下文件:

1、全部保存在内部存储的文件。

2、全部保存在getExternalFilesDir()文件夹的外部存储文件;

注意:你须要定期手动清理通过getCacheDir()缓存的文件和不再须要的文件。

总结:

以上解说了Android系统中文件保存的相关知识,文件保存依据保存位置分为外部存储和内部存储,依据开放性和相应用程序的可用性分为私有类型和公有类型。还有文件保存的方法和一些注意事项。网友们有什么疑惑敬请留言或者回复我的公众号:coder_online。

大家假设对编程感兴趣。想了解很多其它的编程知识,解决编程问题。想要系统学习某一种开发知识,我们这里有java高手。C++/C高 手,windows/Linux高手,android/ios高手,请大家关注我的微信公众号:程序猿互动联盟or coder_online,大牛在线为您提供服务。

时间: 2024-10-15 09:48:08

Android数据保存之文件保存的相关文章

Android数据存储之文件存储

首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. public void save()    {        try {            FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);            outStre

Android 数据存储(二) 文件的使用

在Android中,我们可以将一些数据直接以文件的形式保存在设备中.例如:一些文本文件.PDF文件.音视频文件和图片等.Android  提供了文件读写的方法. 通过 Context.openFileInput()方法获得标准Java文件输入流(FileInputStream),通过Context.openFileOutput()方法获得标准Java文件输出流( FileOutputStream ).使用 Resources.openRawResource(R.raw.myDataFile)方法

Android 数据缓存-文件存储

Android APP开发过程中,我们通常会加入缓存模块.缓存即在本地保存APP的一些数据,大部分是将网络请求的数据进行本地保存,这样在缓存数据有效期内就可以直接使用缓存数据,降低了APP和服务器的压力,也极大提升了用户体验.Android数据缓存既可以以数据表的形式进行保存,也可以以文件的形式进行缓存.这里我主要通过缓存文件存储数据,并在APP下一次启动时读取. Usage 整个Cache模块的设计思想很简单,每个缓存数据都对应一个key,每个缓存数据又会被存到以此key命名的文件中,需要时直

Android数据存储之文件

文件  Android中对文件的操作和Java是一样的. Android系统中存储系统分为内部存储和外部存储两种 内部存储空间 RAM内存:运行内存,相当于电脑的内存. ROM内存:存储内存,相当于电脑的硬盘 在ROM内存中写写数据不需要权限 在Android中,组件之间不能相互转换EditText不能转换成EditText 案例记住登录用户名和密码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro

Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/files/LoginTest.txt------/data/data/(包名)/files/(文件名) 导出的文件内容: 三.实现代码 新建一个Android 工程.这里我选择的是2.1即API 7,进行开发的,其它都是默认下一步下一步即可. /datasave/res/layout/activity

Android 数据保存

Android数据保存方法 android数据保存主要保存以下三种: 1.共享参数文件中保存简单的键值对数据: 2.保存任意的文件数据到Android的文件系统中: 3.使用SQLite数据库管理 保存键值集 通过使用SharePreferences API来保存简单的键值对数据. 共享参数文件的获取或创建: 可以通过以下两种方法来获取: getSharedPreferences()  该方法需要提供一个共享参数文件的名称标识,该方法可以在任意Context中调用 getPreferences(

Android开发之文件保存读取

Android中文件保存读取可选择在手机本身存储.外存储如SD卡中进行,本文将依次介绍. 1.在手机本身存储保存.读取文件. 布局文件如下:     效果图如下: 在文件名框中填写保存时的文件名,文件内容框填写保存内容,点击保存后即可实现保存至手机本身存储. .java代码如下: MainActivity.java 此处的getApplicationContex()方法(生命周期是整个应用,用MainActivity.this代替时表示获取的是该Activity的上下文,生命周期为该Activi

学习Android之第八个小程序文件保存(Notification、AndroidTestCase)

效果图:       .java文件有MainActivity.java.FileService.java.FileServiceTest.java, .xml文件有activity_main.xml. 本次注重AndroidTestCase类的使用,在开发中非常实用.用于测试某一功能. 使用AndroidTestCase类,有如下的要求: 1.在AndroidManifest.xml文件中,<manifest></manifest>中添加如下: <instrumentati

[android] 数据的异步加载和图片保存

把从网络获取的图片数据保存在SD卡上, 先把权限都加上 网络权限 android.permission.INTERNET SD卡读写权限 android.permission.MOUNT_UNMOUNT_FILESYSTEMS android.permission.WRITE_EXTERNAL_STORAGE 总体布局  写界面,使用ListView,创建条目的布局文件,水平摆放的ImageView TextView 在activity中获取到ListView对象,调用setAdapter()方