Android数据保存之文件保存
前言:
选择内部存储还是外部存储:
内部存储:
- 始终存在可用;
- 保存的文件默认只能被保存文件的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:
大家最常见的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数据保存之文件保存的更多相关文章
- Android 数据存储之 文件存储
-------------------------------------------文件存储----------------------------------------------- 文件存储是 ...
- Android数据存储之文件存储
首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. public ...
- Android数据持久化技术 — — —文件存储
文件保存 package com.example.datastroredtest; import android.app.Activity;import android.os.Bundle;impor ...
- Android下使用Properties文件保存程序设置
原文:http://jerrysun.blog.51cto.com/745955/804789 废话不说,直接上代码. 读取.properties文件中的配置: String strValue ...
- 【转】Android下使用Properties文件保存程序设置
原文:http://jerrysun.blog.51cto.com/745955/804789 废话不说,直接上代码. 读取.properties文件中的配置: String strValue ...
- Android数据保存之SharedPreference
前言: 程序中处理的大部分问题都与数据有关,读取数据显示在UI上,读取的数据可以是本地的,也可以是网络的.保存用户数据到存储空间,可以是本地的数据库,文件等,也可以是保存到网络服务器.总之大部分的程序 ...
- android数据保存
永久保存数据的方法:1.Shared Preferences 以键值对的形式存储基本数据类型( booleans, floats, ints, longs, and strings),存储的数据在限制 ...
- Android 学习笔记之实时保存数据-现场保护onSaveInstanceState()
数据保存:在软件开发中我们希望保存下各个Activity数据,以实现客户数据的时时保存,达到较好的用户体验. 那么我们需要解决如下问题: 1.什么时候保存? 2.保存哪些数据? 我想保存应用产 ...
- 【Android Developers Training】 25. 保存文件
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- Chapter4_控制执行流程
总结java中所有的与流程控制有关的知识 (1)表达式判断 Java中只允许true或者false来作为判断条件,不允许用0或者非0值作为判断条件. (2)if-else 与流程密切相关的语句,决定了 ...
- 唉 调皮的ListView
唉 调皮的ListView 本次任务是 运用LisTView和自定义Adapter 来实现资料以列表的形式展现 来看代码 *** 布局代码老规矩 直接贴上 <LinearLayout andro ...
- 关于chrome密码保存框的神坑,这样子解决就行
- idea使用自动生成变量的时候总是默认final,每次都会跳出来declare final的选项,并且默认是勾选的,很难受
看下截图: 我这边首先要保证:settings----->Editor------>Code Style-------->java下的这两个选项不被勾选; 然后在生成变量的时候,再次 ...
- web测试和app测试的区别
功能上: 功能上没有什么区别,都是用同样的方法来写用例(等效.边界值...) 架构上: web是B/S架构(浏览器和服务器)代码更新后数据会同步,可以保证所有客户一致 app是C/S架构(客户端和服务 ...
- Spring的声明式事务管理<tx:advice/>
<tx:advice/> 有关的设置 这一节里将描述通过 <tx:advice/> 标签来指定不同的事务性设置.默认的 <tx:advice/> 设置如下: 事务传 ...
- UEditor可以如何直接复制word的图文内容到编辑器中?
下载并打开工程: 文档的上传 运行: 复制随便一篇文档,粘贴进去. 通过粘贴后,文档以及图片被粘贴进来了,看看html代码: 图片全部使用img标签统一.传输进度条的效果也不错. 文档图片被放置在 ...
- Paper | 学习多任务中的最佳分/ 合结构(十字绣结构)
目录 1. 问题 2. 十字绣结构(Cross-stitch architecture) 3. 实验设计 论文:Cross-stitch Networks for Multi-task Learnin ...
- 日程管理Demo4中的bug
Demo4的github地址 模拟器有点慢之后贴图 https://git.oschina.net/annie_guo/study.git 在登陆注册界面中java的提示语言(Login.java) ...
- 数独计算(C#)
计算零到多个可能的数独结果,并打印到Console中. 调用方法 MainController mc = new MainController(); mc.Do(); 输入 数独数据 类型为int[, ...