android数据存储的四种方案(二)

文件流操作

二.openFileOutput和openFileInput

openFileOutput : 打开要写入的文件,返回一个OutputStream对象
openFileInput:打开要读取的文件,返回一个InputStream对象
这两个Stream对象的创建过程类似于SharedPreferences对象的初始化过程:

OutputStream os = openFileOutput("file.txt",Activity.MODE_PRIVATE);

InputStream is = openFileInput("file.txt");

区别只是第一个参数多了一个扩展名
无论是SharedPreferences还是今天说的这两个,他们在初始化时都是仅仅指定了文件名,而不是文件路径,所以,他们只能将文件保存到固定的路径对于OutputStream和InputStream将文件保存在DDMS里的File explore的data/data//files目录,SharedPreferences将文件保存在data/data//shared_prefs中.
具体来看一个小例子:

public void onClick(){
try {
            //打开要写入的文件
            OutputStream os = openFileOutput("file.txt", Activity.MODE_PRIVATE);
            String str = "中国万岁";
            //将要写入的字符串转化为字节写入
            os.write(str.getBytes("utf-8"));
            os.close();

            //打开要读取的文件夹
            InputStream is = openFileInput("file.txt");
            byte [] buffer = new byte[128];
            int byteCount = is.read(buffer);
            //将读取到的字节转化为字符串
            String str1 = new String(buffer, 0, byteCount, "utf-8");
            Toast.makeText(getApplicationContext(), str1, 2).show();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

:虽然openFileOutput,openFileInput方法可以获得outputStream以及InputStream对象,且可以通过流对象人已处理数据,但是跟SharedPreferences一样只能在手机内存卡的指定目录存储数据,都存在局限性,所以接下来看一种更高级的读写SD卡的方法

读取SD卡中的文件

FileOutputStream和FileInputStream用来读取指定路径的文件

这里直接上代码吧,这次是将android工程里的assets目录里的text.png
图片存入SD卡,点击按钮后再从SD卡中取出该图片并设置给ImageView

try{
            //创建FileOutputStream对象用于将文件写入SD卡
            FileOutputStream fos = new FileOutputStream(android.os.Environment.getExternalStorageDirectory() + "/picture.png");
            //读取assetc目录中的图片返回一个InputStream对象
            InputStream is = getResources().getAssets().open("text.png");
            //一次写8k
            byte[] buffer = new byte[8192];
            int count = 0;
            while((count = is.read(buffer)) >= 0){
                fos.write(buffer, 0, count);
            }
            //刷新流
            fos.flush();
            //关闭流
            fos.close();
            is.close();
            //至此图片已经存入SD卡
        }catch(Exception e){
            e.printStackTrace();
        }
public void onClick(View view){
        //指定读取位置
        String fileName = android.os.Environment.getExternalStorageDirectory() + "/picture.png";
        try {
            //判断图片是否存在
            if(!new File(fileName).exists()){
                Toast.makeText(getApplicationContext(), "找不到数据", 1).show();
                return;
            }
            //获取fis对象用来读取SD卡中的数据(这里是图片)
            FileInputStream fis = new FileInputStream(fileName);
            imageView = (ImageView)findViewById(R.id.imageView1);
            //利用图片工厂获取图片
            Bitmap bitmap = BitmapFactory.decodeStream(fis);
            imageView.setImageBitmap(bitmap);
            fis.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

:我们一般获取SD卡路径除了用andorid.os.Enviroment.getExternalStorageDirectory方法,还可以直接使用“/sdcard”,但是建议使用前者,这样一旦系统改变了路径,应用程序会立刻获得最新的路径,使程序更健壮
最后还需要加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值