在Android中,所创建的用于保存数据的文件可以位于两个位置:设备本身的存储空间中,或是外接的存储设备中(SD卡)。无论存储在哪个位置,在默认的情况下,该文件都是不能够供不同的应用程序共享的。文件放在不同位置,它们的读取方式也有一些不同。
下面分别介绍如何将文件存储在设备本身的存储空间中以及外接的存储设备中。
一、将文件存储在设备本身的存储空间中
通常来说,“存储在设备本身”一般指的是在机身内存目录data/data/工程包名/files下,这个文件夹称为私有文件夹,下面介绍的方法是系统默认在该目录下对文件进行操作。机身内存的其它目录是不建议操作的,因为这会带来许多管理上的问题。
在Android中,可以使用Context类提供的以下两个方法来创建存储对象:
(1)public abstract FileInputStream openFileInput(String name);//打开文件输入流
(2)public abstract FileOutStream openFileOutput(String name, int mode);//打开文件输出流
上面这两个方法,都已经将工作目录指向了机身内存目录data/data/工程包名/files这个文件夹。注意,想要操作这个文件夹的文件,只能通过以上两种方法实现!
其中,openFileInput()方法表示打开文件输入流,用于从文件中读取数据;openFileOutput()方法表示打开文件输出流,用于向文件中写入内容。
此外,openFileOutput()方法中的第二个参数mode用于指定文件的操作模式,其可选值有以下4种:
(1)Context.MODE_APPEND;//内容追加模式。在该模式下,系统会检查文件是否存在,如果存在,则将内容追加到文件的末尾,如果文件不存在,则创建该文件并写入内容。
(2)Context.MODE_PRIVATE;//默认操作模式。在该模式下,文件作为私有数据,只能被该应用程序本身访问。并且,在该模式下,写入的内容会覆盖原文件的内容。
(3)Context.MODE_WORLD_READABLE;//可读模式。在该模式下,别的应用程序可以读取该文件内容。
(4)Context.MODE_WORLD_WRITEABLE;//可写模式。在该模式下,别的应用程序可以将内容写入该文件。
1、存储文件
一个简单的存储文件的例子如下:
public void saveContentToLocal(String fileNmae, String content) throws IOException {
FileOutputStream fileOutputStream = mContext.openFileOutput(fileNmae, Context.MODE_APPEND);
fileOutputStream.write(content.getBytes());
if(fileOutputStream != null) {
fileOutputStream.close();
}
}
以上的代码,通过将openFileOutput()的第二个参数设定为MODE_APPEND,指定了以内容追加模式存储文件,文件名为fileName,内容为content。
2、读取文件
那么又该如何在程序中读取该文件呢?下面的代码给出了一种实现方案。
public void getFileFromLocal(String fileNmae) throws IOException {
FileInputStream fileInputStream = this.openFileInput(fileNmae);
int len = 0;
byte[] data = new byte[1024];
while((len = fileInputStream.read(data)) != -1) {
}
if(fileInputStream != null) {
//关闭FileInputStream对象
fileInputStream.close();
}
}
二、将文件存储在外接存储设备中(SD卡)
通常,手机的内存是极其有限的,更普遍的做法是将文件存储到SD卡中。
将文件存储在外接存储设备中的方法和将文件存储在设备本身的存储空间中的方法类似,另外,我们习惯在操作SD卡前对其检查,以确保运作不出错。同时,这里介绍用RandomAccessFile方法操作数据,这种方法更为方便。
1、检测SD卡的状态
在Android中,检测SD卡的状态需要使用到Environment类。通过使用该类的getExternalStorageState()方法可以获得外接存储设备(SD卡)的状态。其中,外接存储设备的状态有九种,具体如图所示。
![](http://images.cnitblog.com/blog/430074/201304/02235158-199d81f96534426aa1eac60ba4893f55.jpg)
SD状态 | 现象描述 |
MEDIA_MOUNTED | SD卡正常挂载 |
MEDIA_REMOVED | 无介质 |
MEDIA_UNMOUNTED | 有介质,未挂载,在系统中删除 |
MEDIA_BAD_REMOVAL | 介质在挂载前被移除,直接取出SD卡 |
MEDIA_CHECKING | 正在磁盘检查,刚装上SD卡时 |
MEDIA_SHARED | SD卡存在但没有挂载,并且通过USB大容量存储共享,操作打开USB存储 |
MEDIA_MOUNTED_READ_ONLY | sd卡存在并且已挂载,但是挂载方式为只读 |
MEDIA_NOFS | 介质存在但是为空白或用在不支持的文件系统 |
MEDIA_UNMOUNTABLE | 存在SD卡但是不能挂载,例如发生在介质损坏 |
通过上表可以看出,只有在SD卡状态为 MEDIA_MOUNTED 时/mnt/sdcard目录才是可读可写,并且可以创建目录及文件。
判断很简单,用 if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) 就可以了。
2、存储文件
存储文件到SD卡中的一个简单例子如下:
public void rand(String fileNmae, String content) throws IOException {
//Environment.getExternalStorageDirectory(),获取SD卡根目录,也就是/mnt/sdcard
File fi = new File(Environment.getExternalStorageDirectory(),fileNmae);
RandomAccessFile ra = new RandomAccessFile(fi, "rw");
//指针移到头部
ra.seek(0);
ra.writeChars(content);
//记得关闭
ra.close();
}
3、读取文件
public void getrand(String fileNmae) throws IOException {
File fi = new File(Environment.getExternalStorageDirectory(),fileNmae);
RandomAccessFile ra = new RandomAccessFile(fi, "r");
ra.seek(0);
char ch=ra.readChar();
ra.close();
}
有一点需要说明,因为程序中用到读写SD卡,所以需要在AndroidManifest.xml文件中加入向SD卡中写入数据的权限和在SD卡中创建和删除文件的权限。具体实现方法如下:
<!-- 向SD卡中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 在SD卡中创建和删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
以上部分内容转载或参考来源如下:
http://blog.csdn.net/flowingflying/article/details/6914812
http://www.cnblogs.com/leizhenzi/archive/2011/10/18/2216428.html
http://blog.csdn.net/ztp800201/article/details/7322110
在此表示感谢。
转载请注明来源,版权归原作者所有,未经同意严禁用于任何商业用途。
微博:http://weibo.com/theworldsong
邮箱:theworldsong@foxmail.com