在前面讲的那三个方法:openFileOutput 、openFileInput 虽然都能通过流对象OutputStream和InputStream可以处理任意文件中的数据,但与 SharedPreferences 一样,只能在手机内存的指定目录下建立文件,因此,在实际的开发使用中有很大的局限性,那么在这一节中,我们来看一个比较高级的方法来实现数据的持久化——读写SD卡上的内容。
——读取assets目录中的文件
android中的文件夹assets存放的是二进制的文件格式,比如音频、视频、图片等,但该目录下的文件不会被R.java文件索引到,如果想读取该目录下的文件还需要借助AssetManager对象。
代码如下:
/**
* 将图片文件保存到SD卡的根目录下
*
* 虽然确定SD卡的路径是可以直接使用"/sdcard"的,但在实际开发中建议使用:android.os.Environment.getExternalStorageDirectory()
* 方法获得SD卡的路径,这样一旦系统改变了路径,应用程序会立刻获得最新的SD卡的路径,这样做会使程序更健壮。
*/
public void writeToSD() {
try {
//创建用于将图片保存到SD卡上的FileOutputStream对象
FileOutputStream fos = new FileOutputStream(android.os.Environment.getExternalStorageDirectory() + "/image.jpg");
//打开assets目录下的image.jpg文件,并返回InputStream对象
InputStream is = getResources().getAssets().open("image.jpg");
//定义一个byte数组,用来保存每次向SD卡中文件写入的数据,最多8k
byte[] buffer = new byte[8192];
int count = 0;
//循环写入数据
while((count = is.read(buffer)) != -1)
{
fos.write(buffer, 0, count);
}
fos.close();
is.close();
Toast.makeText(this, "已成功将图片保存在SD卡中", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 从SD卡中读取图片文件
* @throws IOException
*/
public void readFromSD() throws IOException{
//指定SD卡中的图像文件名
String fileName = android.os.Environment.getExternalStorageState() + "image.jpg";
//判断文件图片是否存在
if (!new Fil