数据存储之文件存储

文件存储,即数据以文件的形式进行保存。Android操作系统允许应用程序将需要保存的数据以文件形式保存在设备的内部存储里面,也允许应用程序将需要保存的数据以文件形式保存在设备的外部存储(SDCard)里面。

1.内部存储
默认情况下,这些文件是应用程序私有的,对其他应用程序是不透明的,对用户也是不透明的,当程序卸载过后,这些文件也将被删除。
Activity提供了openFileOutput()方法可以用于把数据输出到文件中。

存取数据:

    /**
     * 保存数据至内部存储
     * @param filename 文件名称
     * @param content 要写入的字节数据
     */
    private  void writeToInternalStorage(String filename, byte[] content) {
        if(null == content || 0 == content.length){//对写入数据合法性进行校验
            return;
        }
        try {
            //根据传入的第一个参数,打开一个用来写数据的文件,如果文件不存在,则创建这个文件
            FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
            fos.write(content);//向输出流写入数据
            fos.close();//关闭输出流
        } catch (Exception e) {
            Log.d(TAG, "写入失败:exception:" + e);
            throw new RuntimeException("write to internal storage exception");
        }
    }

上述操作分为以下步骤:
调用openFileOutput(String name, int mode)方法打开一个写入数据操作的文件,第一个参数用来指定文件的名称,如果这个文件不存在,则会创建这个文件。第二个参数指定文件的操作模式,与之前介绍的SharedPreferences对象相类似;
调用FileOutputStream对象的write()方法向文件写入数据;
调用FileOutputStream对象的close()方法关闭输出流。

读取数据:

/**
     * 从内部存储读取数据
     * @param fileName  文件名称
     * @return
     */
    private byte[] readFormInternalStorage(String fileName){
        int len = 1024;
        byte[] buffer = new byte[len];
        try {
            //打开一个用来读取数据的文件
            FileInputStream fis = openFileInput(fileName);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int nrb = fis.read(buffer, 0, len);//每次读取1024个字节的数据存放在buffer当中
            while (nrb != -1) { //还有数据可以读取
                baos.write(buffer, 0, nrb);
                nrb = fis.read(buffer, 0, len);//循环读取
            }
            buffer = baos.toByteArray();
            baos.close();
            fis.close();
        } catch (Exception e) {
            Log.d(TAG, "读取失败:exception:" + e);
            throw new RuntimeException("read from  internal storage exception");
        } 
        return buffer;
    }

读取内部存储的数据与传统的JAVA IO读取文件的方式一致。

说明:内部存储的文件的路径为/data/data/包名/files/文件名

2.外部存储
外部存储的文件都是可读的,对任何一个应用程序来说都是透明的。
在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中加入访问SDCard的权限如下:

 <!-- 在SDCard卡创建和删除文件的权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <!-- 往SDCard卡当中写入数据的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

保存数据:

/**
     * 写入数据到SDCard卡
     * 
     * @param fileName
     *            文件名称
     * @param content
     *            字节数组
     */
    private void saveToSDCard(String fileName, byte[] content) {
        if (isExternalStorageWriteable()) {// 检测SDCard是否可以写入
            File sdcardDir = Environment.getExternalStorageDirectory();//获取SDCard的路径
            File baseDir = new File(sdcardDir, "externaldemo");
            File file = new File(baseDir,  fileName);

            try {
                if(! baseDir.exists()){//如果SDCard不存在"externaldemo"目录,则创建
                    baseDir.mkdir();
                }
                if(file.exists()){//如果"externaldemo"目录不存在"data.txt",则创建
                    file.createNewFile();
                }
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(content);
                fos.close();
            } catch (Exception e) {
                Log.d(TAG, "写入SDCard出错,exception:" + e);
                throw new RuntimeException("write to sdcard exception");
            }
        }
    }

读取数据:

// 从SDCard读取数据
    private byte[] loadFromSDCard(String fileName) {
        if (isExternalStorageReadable()) {// 检测SDCard是否可以读取
            int len = 1024;
            byte[] buffer = new byte[len];
            File dir = Environment.getExternalStorageDirectory();// 获取SDCard的路径
            File file = new File(dir, "externaldemo/"+ fileName);
            try {
                FileInputStream fis = new FileInputStream(file);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int nrb = fis.read(buffer, 0, len);
                while (nrb != -1) {
                    baos.write(buffer, 0, nrb);
                    nrb = fis.read(buffer, 0, len);
                }
                buffer = baos.toByteArray();
                fis.close();
            } catch (Exception e) {
                Log.d(TAG, "读取SDCard出错:exception:" + e);
                throw new RuntimeException("read from sdcard exception");
            }
            return buffer;
        }
        throw new RuntimeException("sdcard is not readable");
    }

说明:程序向SDCard卡中保存数据以及从SDCard中读取数据时,需要先对SDCard的状态进行响应的判断:
检测SDCard是否可以写入:

// 检测SDCard是否可以写入
    private boolean isExternalStorageWriteable() {
        return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ? true : false;
    }

检测SDCard是否可以读取:

// 检测SDCard是否可以读取
    private boolean isExternalStorageReadable() {
        return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || 
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(Environment.getExternalStorageState()) ? true : false;
    }

源码下载:http://download.csdn.net/detail/yuyinghua0302/9502011

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值