内部存储,在Android中,开发者可以直接使用设备的内部存储器中保存文件,默认情况下,以这种方式保存的和数据是只能被当前程序访问,在其他程序中是无法访问到的,而当用户卸载该程序的时候,这些文件也会随之被删除。
有两种方法可以以文件的形式用来获取内部存储空间目录:
1、File getFilesDir():获取代表内部存储文件系统的文件。
2、File getCacheDir ():获取代表内部临时存储目录的文件。
为了在以上的目录中创建文件,使用如下的方法:
File file = new File(context.getFilesDir(), filename);
然后就使用FileInputStream和FileOutputStream就可以对这些文件进行操作了,如下代码所示。
FileOutputStream fos1=new FileOutputStream(new File(getFilesDir(), "test"));
除了上面介绍的方法,用的比较多的是下面介绍的方法:
数据写入方式
基本上也是先获得一个文件的输出流,然后以write()的方式把待写入的信息写入到这个输出流中,最后关闭流即可,这些都是Java中IO流的操作。具体步骤如下:
1、使用Context.openFileOutput()方法获取到一个FileOutputStream对象。
2、把待写入的内容通过write()方法写入到FileOutputStream对象中。
3、最后使用close()关闭流。
上面介绍的Context.openFileOutput()方法有两个重载函数,它们分别是:
FileOutputStream openFileOutput(Stringname):以MODE_PRIVATE的模式打开name文件。
FileOutputStream openFileOutput(Stringname,int mode):以mode的模式打开name文件。
上面第二个重载函数中,mode为一个int类型的数据,这个一般使用Context对象中设置好的常量参数,有如下几个:
MODE_APPEND:以追加的方式打开一个文件,使用此模式写入的内容均追加在原本内容的后面。
MODE_PRIVATE:私有模式(默认),如果文件已经存在会重新创建并替换原文件,如果不存在直接创建。
MODE_WORLD_READABLE:以只读的方式打开文件。
MODE_WORLD_WRITEABLE:以只写的方式打开文件。
代码如下:
FileOutputStream fos = openFileOutput(file_name,Context.MODE_PRIVATE);
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
osw.write(et.getText().toString());
osw.flush();
fos.flush();
osw.close();// 后打开的先关闭,有顺序的
fos.close();
数据读取方式
使用Context.openFileInput()方法获取到一个FileInputStream对象,从FileInputStream中读取数据,也有两个重载函数,和Context.openFileOutput()类似。
FileInputStream fis = openFileInput(file_name);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
char input[] = new char[fis.available()];
isr.read(input);
isr.close();
fis.close();
text.setText(new String(input));
保存缓存文件
当你只是想缓存一些文件,而不是永久保存这些文件,应该使用getCacheDir()方法来打开一个代表APP用来存储临时缓存文件的内部存储空间目录的文件,使用createTempFile方法在目录下创建文件,代码如下所示:
public File getTempFile(Context context, String url) {
File file = null;
try {
String fileName = Uri.parse(url).getLastPathSegment();
// 在APP的缓存目录下面,创建一个临时文件
file = File.createTempFile(fileName, null, context.getCacheDir());
//file=new File(context.getCacheDir(), fileName); 和以上方法一样
FileOutputStream fos=new FileOutputStream(file);
FileInputStream fis=new FileInputStream(file);
} catch (IOException e) {
// Error while creating file
}
return file;
}
注意:当设备的内部存储空间不足的时候,Android可能会删除这些缓存文件来释放空间。所以你应该自己主动管理这些缓存文件而不是让系统来管理,当卸载APP的时候,这些缓存文件也会被移除。
其他有用的方法
还有几个方法需要特别注意一下,这几个方法对于文件关系提供了更好的支持,配合上面介绍的方式,就可以对文件的数据进行常规的CRUD操作(增删改查),方法如下:
File getDir (String name, int mode):在内部存储空间创建或者打开一个存在的目录。
boolean deleteFile(String name):删除一个指定文件名为name的文件。
String[] fileList():当前应用内部存储路径下的所有文件名。