android-文件存储的使用

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

1、使用SharedPreferences存储数据;

2、文件存储数据;

3、SQLite数据库存储数据;

4、使用ContentProvider存储数据;

5、网络存储数据

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

判断SD卡是否存在

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

获取SD剩余空间大小

android-文件存储的使用
/**
     * 获取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;
        }
    }
android-文件存储的使用

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

android-文件存储的使用
/**
     * 复制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-文件存储的使用

android-文件存储的使用

上一篇:使用jqMobi开发app基础:a标签的使用


下一篇:Android View的onClick回调机制