您的位置:首页 > 移动开发 > Android开发

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

2016-02-06 20:39 351 查看
文件流操作

二.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"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: