文件流操作
二.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"