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();
}

最新文章

  1. python 安装
  2. VS2013新建MVC5项目,使用nuget更新项目引用后发生Newtonsoft.Json引用冲突的解决办法
  3. cocos2dx 3.8版关于#include "GB2ShapeCache-x.h"
  4. IRaster、IRasterlayer、IRasterdataset之间的转换
  5. WIN7只能上QQ打不开网页,使用CMD输入netsh winsock reset
  6. 洛谷P1472 奶牛家谱 Cow Pedigrees
  7. Android开发之PopupWindow
  8. windows进程函数试炼
  9. Hadoop yarn配置参数
  10. Calendar 日历控件使用
  11. hdu 1575 Tr A(矩阵快速幂乘法优化算法)
  12. 微信公众号开发系列-获取微信OpenID
  13. LeetCode重建二叉树系列问题总结
  14. python-*args和**kwargs作用和区别
  15. Spring boot 配置自己的拦截器
  16. CAN总线相关的几个gitlab代码
  17. python 3以上版本使用pickle.load读取文件报UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6
  18. 不存在具有键“test”的“IEnumerable<SelectListItem>”类型的 ViewData 项。
  19. opencv 替换图像中的一部分
  20. FPGA设计中的异步复位、同步释放思想

热门文章

  1. MICAPS二次开发一些功能调用
  2. Java期末设计(十三周)
  3. 【Python①】python简介,安装以及配置
  4. SharePoint中报表选择
  5. Bootstrap<基础十> 响应式实用工具
  6. python学习05——字典
  7. js动画之链式运动
  8. IE关闭兼容性视图
  9. SQL表旋转
  10. Android之如何使用JUnit进行单元测试