Android提供了5种方式存储数据:

1、使用SharedPreferences存储数据;

2、文件存储数据;

3、SQLite数据库存储数据;

4、使用ContentProvider存储数据;

5、网络存储数据

  做android开发中,很多软件需要实现数据存储----文件存储的功能,笔者最近一个项目就有用到,一般情况下我们将一些文件(如视频片段)存储在外挂的SD卡上,如果需要使用SD卡,那么必须要检测SD卡是否可用,在不可用的时候文件数据该怎样保存,这都是值得思考的问题,笔者最近这个项目将一部分视频放到了assets文件夹下,当用户安装并第一次运行软件的时候需要将视频拷贝到SD卡上,如果SD卡不存在(检测不可用)且SD卡剩余空间小于10M时就将数据保存到android的文件系统中。

判断SD卡是否存在

/**
* 判断SD卡是否存在
*
* @return
*/
public static boolean ExistSDCard() {
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
return true;
} else
return false;
}

获取SD剩余空间大小

/**
* 获取SD卡剩余空间
*
* @return MB
*/
public static long getSDFreeSize() {
// 取得SD卡文件路径
File path = Environment.getExternalStorageDirectory();
StatFs sf = new StatFs(path.getPath());
// 获取单个数据块的大小(Byte)
long blockSize = sf.getBlockSize();
// 空闲的数据块的数量
long freeBlocks = sf.getAvailableBlocks();
// 返回SD卡空闲大小
// return freeBlocks * blockSize; //单位Byte
// return (freeBlocks * blockSize)/1024; //单位KB
if(ExistSDCard()){
return (freeBlocks * blockSize) / 1024 / 1024; // 单位MB
} else {
return 0;
}
}

复制assets文件夹下的视频片段到SD卡或手机存储中

/**
* 复制assets下视频片段到sd
*
* @param context
* 上下文
* @throws IOException
*/
public static void copyAssetsVideo(String videoName, Context context)
throws IOException {
String toPath = null;
File dir = null;
FileOutputStream os = null;
if (ExistSDCard() && getSDFreeSize() > 10) {
toPath = Environment.getExternalStorageDirectory()
.getAbsolutePath()
+ "/"
+ Constant.PACKAGE_NAME
+ "/"
+ Constant.VIDEO_PATH_PREFIX
+ videoName
+ Constant.VIDEO_FORMAT_MP4;
dir = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath()
+ "/"
+ Constant.PACKAGE_NAME
+ "/"
+ Constant.VIDEO_PATH_PREFIX);
if (!dir.exists())// 判断文件夹是否存在,不存在就新建一个
dir.mkdirs();// 注意这里是mkdirs()建立文件夹的原则是:如果父文件夹不存在并且最后一级子文件夹不存在,它就自动新建所有路经里写的文件夹;如果父文件夹存在,它就直接在已经存在的父文件夹下新建子文件夹。
try {
os = new FileOutputStream(toPath);// 得到文件的写入流
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
} else {
// toPath = Constant.DB_PATH_PREFIX + Constant.PACKAGE_NAME
// + Constant.FILE_PATH_SUFFIX
// + videoName + Constant.VIDEO_FORMAT_MP4;
toPath = videoName + Constant.VIDEO_FORMAT_MP4;
dir = new File(Constant.DB_PATH_PREFIX + Constant.PACKAGE_NAME
+ Constant.FILE_PATH_SUFFIX);
try {
os = context.openFileOutput(toPath, Context.MODE_PRIVATE);// 得到文件的写入流
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
}
InputStream is = context.getAssets().open(
Constant.VIDEO_PATH_PREFIX + videoName
+ Constant.VIDEO_FORMAT_MP4);// 得到文件的数据流
byte[] buffer = new byte[1024];
int count = 0;
try { while ((count = is.read(buffer)) > 0) {
os.write(buffer, 0, count);
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
is.close();
os.close();
}

android-文件存储的使用的更多相关文章

  1. Android 文件存储浅析

    最近做的一个需求和文件存储有关系.由于之前没有系统梳理过,对文件存储方面的知识一直很懵懂.趁着周末有时间,赶紧梳理一波. 这首从网上找到的一张图,很好的概括了外部存储和内部存储. 下面我们再来具体介绍 ...

  2. Android文件存储

    文件存储是Android中最基本的一种数据存储方式,它不读存储的内容进行任何的格式化处理,所有数据原封不动的保存在文件之中.如果想用文件存储的方式保存一些较为复杂的数据,就需要定义一套自己的格式规范, ...

  3. android: 文件存储

    数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑 关机的情况下,这些数据仍然不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在 存储设备中的数据是处于持久状态的,持久化 ...

  4. android文件存储位置切换

    最近有个需求,助手的google卫星地图和OpenCycleMap下载的离线地图数据,要能够在内置存储和外置存储空间之间切换,因为离线瓦片数据非常大,很多户外用户希望将这些文件存储在外置TF卡上,不占 ...

  5. 转:Android文件存储路径getFilesDir()与getExternalFilesDir的区别

    作为一个开发者,我们经常需要通过缓存一些文件到SD卡中,常见的方式就是,通过: File sdCard = Environment.getExternalStorageDirectory(); 获取S ...

  6. android 文件存储&SharedPreferences

    一.文件存储 文件存储主要是I/O流的操作,没什么好说的,需要注意的是保存文件的各个目录. 下面为常用的目录: public static File getInFileDir(Context cont ...

  7. 程序员带你学习安卓开发系列-Android文件存储

    这是程序员带你学习安卓开发系列教程.本文章致力于面向对象程序员可以快速学习开发安卓技术. 上篇文章:.Net程序员快速学习安卓开发-布局和点击事件的写法 主要讲解了布局和点击事件的写法. 上篇文章补充 ...

  8. Android文件存储使用参考

    可能遇到的问题 android系统自身自带有存储,另外也可以通过sd卡来扩充存储空间.前者好比pc中的硬盘,后者好移动硬盘. 前者空间较小,后者空间大,但后者不一定可用. 开发应用,处理本地数据存取时 ...

  9. Android 文件存储 和 权限管理

    转载请标明出处: :http://blog.csdn.net/huaiyiheyuan/article/details/52473984 android SD卡主要有两种存储方式 Internal . ...

  10. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

随机推荐

  1. 动态拼接linq 使用Expression构造动态linq语句

    最近在做动态构造linq语句,从网上找了很多,大多数,都是基于一张表中的某一个字段,这样的结果,从网上可以搜到很多.但如果有外键表,需要动态构造外键表中的字段,那么问题来了,学挖掘机哪家强?哦,不是, ...

  2. C# Request中修改header信息

    var headers = app.Context.Request.Headers; Type hdr = headers.GetType(); PropertyInfo ro = hdr.GetPr ...

  3. CentOS集群安装Tmux

    对于Linux的常用者,如果你说你不会tmux,那你就out啦~ 1. 什么是Tmux? 先来看看Tmux长什么样. tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD ...

  4. 在CDH5.5.0上安装Kudu6.0

    1. 下载安装文件: a. CSD文件:KUDU-0.6.0.jar b. kudu parcel:KUDU-0.6.0-1.kudu0.6.0.p0.334-el6.parcel和manifest. ...

  5. php ob_start()、ob_end_flush和ob_end_clean()多级缓冲

    ob_start() 和 ob_end_flush() 是一对很好的搭档,可以实现对输出的控制.当成一对出现理解起来就没什么问题,但是当他们两个各自出现次数增加时,就比较难理解了. <?php ...

  6. DotNetBar for Windows Forms 11.8.0.8冰河之刃重打包版

    关于 DotNetBar for Windows Forms 11.8.0.8_冰河之刃重打包版 基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DL ...

  7. iptables基本规则配置(二)

    注释:文章中fg:为示例  红色标记的为命令 在上篇博文中详细讲解了iptables的原理及一些常用命令,这里在简要的说明一下: Linux防火墙包含了2个部分,分别是存在于内核空间的(netfilt ...

  8. 用AE (Adobe After Effects) 处理视频

    这话要从年会说起,我们组的年会节目需要一段场外亲友团的评价视频,于是我们就靠在公司门口的logo前拍了这么一段.但是呢,有很多的不理想: 画面抖动 杂音好烦(中午吃饭时拍的,还有好大的微波炉好了的声音 ...

  9. NVelocity用法(转)

    每个人应该知道的NVelocity用法   NVelocity是一个基于.NET的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来 ...

  10. 一篇介绍java与js操作cookie的

    http://blog.csdn.net/xuweilinjijis/article/details/8651188