首页 > 代码库 > Android数据保存之文件保存
Android数据保存之文件保存
前言:
比方你须要保存从网络获取的图片到本地作为缓存数据,而且数量比較大。SharedPreferences就不能满足你的需求了,这个时候就要用到基本上全部平台都会用到的文件保存。
选择内部存储还是外部存储:
内部存储:
- 始终存在可用;
- 保存的文件默认仅仅能被保存文件的app訪问,各个应用之间不能够彼此訪问,仅仅能訪问自己保存的文件。
- 当应用被卸载的时候应用保存的文件会被全然清除掉。
- 假设你想要保存的文件非常安全,不会被用户和其它应用读取到,那么你能够选择内部存储这样的方式。
外部存储:
- 不一定存在,比方有的手机出厂是仅仅有内部存储,没有外部存储,用户自己又没有安装micro-SD卡,这时外部存储是不可用的。
- 读写全然开放的,所以你保存的数据可能会被用户和可其他程序读取;
- 卸载应用时仅仅会删除通过getExternalFilesDir()获取到的文件夹文件;
- 假设你的文件没有必要控制訪问权限,能够同意其他应用或者用户查看,那么外部存储是不错的选择;
注:在默认情况下应用程序安装到内部存储,您能够指定android:installLocation属性在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、File getFilesDir ();
返回一个文件文件夹。这个文件夹下保存应用程序的数据,通过 openFileOutput(String, int) 创建的文件都保存在这个文件文件夹下。这个文件夹大概是:data/data/包名/files,比方豌豆荚应用程序是:data/data/com.wandoujia.phoenix2/files/
返回一个文件文件夹,这个文件夹存放的是应用程序缓存文件,当系统空间不足时这部分文件首先会被删除。这个文件夹大概是: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是必须要设置的。
保存到外部存储:
/* 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:
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中的:
/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。此时返回的是你的应用程序外部存储文件夹的私有文件夹的根文件夹。
查询剩余空间:
删除文件:
总结:
大家假设对编程感兴趣。想了解很多其它的编程知识,解决编程问题。想要系统学习某一种开发知识,我们这里有java高手。C++/C高 手,windows/Linux高手,android/ios高手,请大家关注我的微信公众号:程序猿互动联盟or coder_online,大牛在线为您提供服务。
Android数据保存之文件保存