Android的文件操作
一、Android的文件操作简介
要理解Android的文件存储,首先要明白Android是如何用什么方式获取和存入数据的。Android的文件操作都是通过流的方式进行的,即IO。Android的文件操作跟Java是一样的,文件操作分为输入流(InputStream)和输出流(OutputStream),输入流用于获取文件数据,输出流用于存储文件。输入流和输出流都是很耗费内存空间的,所以在使用Android的IO时,除非特殊需要,一般在使用结束后要记得关闭IO通道。接下来我们就来讲解一下,InputStream和OutputStream。
1、InputStream
InputStream是一个抽象类,其表示字节输入流的所有类的超类。以下是InputStream经常会使用的一些方法。
void | close() |
abstract int | read() |
int | read(byte[] b) |
int | read(byte[] b, int off, int len) |
其中close方法需要特别注意,要记得及时调用close方法关闭输入流。
2、OutputStream
OutputStream是一个抽象类,其表示字节输出流的所有类的超类。以下是OutputStream经常会使用的一些方法。
void | close() |
void | write(byte[] b) |
void | write(byte[] b, int off, int len) |
abstract void | write(int b) |
跟InputStream一样,要记得及时调用close方法关闭输出流。
二、InputStream和OutputStream的获取和使用。
1、操作Android的SD卡的文件
例如在Android中,需要往android手机的自带内存(非SD卡)中读写文件。
Activity的父类 Context 有方法可以获取输出和写入流。
分别是:
openFileOutput(name, mode);
openFileInput(name);
mode有
Context.MODE_PRIVATE; //默认,仅此程序私有
Context.MODE_APPEND; //追加方式
Context.MODE_WORLD_READABLE; //(其它程序)可读
Context.MODE_WORLD_WRITEABLE; //(其它程序)可写
注:SD卡IO需要权限:
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.WRITE_EXTERNAL_STORAGE
2、使用FileInputStream获取文件
在1中我们谈到可以用openFileOutput(name, mode)和openFileInput(name)分别获取输出流和数据输入流,原Java中提供了FileInputStream和FileOutputStream类,分别继承于InputStream和OutputStream,在Android通过这个两个类也是可以获取输入流和输出流的。
1、FileInputStream的使用方法
以下是FileInputStream的构造方法
FileInputStream(File file) |
FileInputStream(FileDescriptor fdObj) |
FileInputStream(String name) |
相应代码:
//newFilename为文件地址
InputStream is= new FileInputStream(newFilename);
2、FileOutputStream的使用方法
以下是FileOutputStream的构造方法
FileOutputStream(File file) |
FileOutputStream(File file, boolean append) |
FileOutputStream(FileDescriptor fdObj) |
FileOutputStream(String name) |
FileOutputStream(String name, boolean append) |
相应代码:
// newFilename为要生成的文件地址
OutputStream os = new FileOutputStream(newFilename);
注:同样需要权限:
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.WRITE_EXTERNAL_STORAGE
3、获取Android的Assets文件夹的数据
在Android中,有时候你不只需要在sd卡中获取文件,只需要从Assets中获取文件。那代码上可以如此处理。
InputStream is = context.getResources().getAssets().open(mfileName);
三、代码示例
1、从resource的asset中读取文件数据
String fileName = "test.txt"; //文件名字
String res="";
try{
//得到资源中的asset数据流
InputStream in = getResources().getAssets().open(fileName);
int length = in.available();
byte [] buffer = new byte[length];
in.read(buffer);
res = EncodingUtils.getString(buffer, "UTF-8");
}catch(Exception e){
e.printStackTrace();
}
2、读写SD卡中的文件。也就是/mnt/sdcard/目录下面的文件 :
//写数据到SD中的文件
public void writeFileSdcardFile(String fileName,String write_str){
try{
FileOutputStream fout = new FileOutputStream(fileName);
byte [] bytes = write_str.getBytes();
fout.write(bytes);
fout.close();
}
catch(Exception e){
e.printStackTrace();
}
}
//读SD中的文件
public String readFileSdcardFile(String fileName){
String res="";
try{
FileInputStream fin = new FileInputStream(fileName);
int length = fin.available();
byte [] buffer = new byte[length];
fin.read(buffer);
res = EncodingUtils.getString(buffer, "UTF-8");
fin.close();
}
catch(Exception e){
e.printStackTrace();
}
return res;
}
以上内容部分参考网络上的博文,附带上一个小demo。
http://download.csdn.net/detail/stop_pig/7896851