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