内部文件存储示例
写了一个应用例子,主要是说明如何使用内部存储保存文件。
安装运行测试应用,主界面如下:
文件目录
在内部存储的话,文件应该存储在getFilesDir()返回的File对象指向的目录下,那么这个目录的路径是什么呢?点击按钮“文件目录”,运行结果如下:
从上图可知,内部存储的文件默认目录为/data/data/com.example.filesave/files,而com.example.filesave是我们应用的包名,所以目录形式实际上为/data/data/<应用包名>/files。
/data/data是内部文件系统的根目录下的路径,如果你的手机没有root的话,是没有权限查看此目录的。
缓存目录
我们知道缓存目录是通过getCacheDir()返回的File对象指向的目录,那么这个目录指向哪儿呢?点击按钮“缓存目录”,显示结果如下:
从上图得知,缓存目录为/data/data/com.example.filesave/cache,目录形式为/data/data/<包名>/cache。注意,如果当前手机的存储空间不够用的话,这个目录下的文件会被系统直接删除的,并且你收不到任何警告。
写文件
点击按钮“写文件”,我们将一个文件写到内部存储文件目录下,代码示例如下:
private void writeFile() {
String filename = "myfile";
String content = etWriteFile.getText().toString();
FileOutputStream fos;
Context context = getActivity();
try {
fos = context.openFileOutput(filename, context.MODE_PRIVATE);
fos.write(content.getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
文件输入的内容如下图所示:
点击按钮“读文件”,可以把相应内容读出来。代码及示例图如下:
private void readFile() {
String filename = "myfile";
String content = "";
FileReader fr = null;
Context context = getActivity();
char[] buffer = new char[1024];
try {
StringBuilder strBuilder = new StringBuilder();
fr = new FileReader(context.openFileInput(filename).getFD());
while (fr.read(buffer) != -1) {
strBuilder.append(buffer);
}
fr.close();
content = strBuilder.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (content.length() != 0) {
tvReadFile.setText(content);
} else {
tvReadFile.setText("<内容空>");
}
}
写缓存与读缓存
读写缓存文件与上面的读写文件是类似的。不同的是,创建缓存文件时,应该使用File.createTempFile()方法,这样你的文件可以生成比较合理的名字。读写缓存文件的代码如下:
private String cacheFileName = "myCache";
private void writeCache() {
String filename = "myCache";
File file = null;
Context context = getActivity();
String content = etWriteCache.getText().toString();
FileOutputStream fos;
try {
file = File.createTempFile(filename, null, context.getCacheDir());
cacheFileName = file.getName();
fos = new FileOutputStream(file);
fos.write(content.getBytes());
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void readCache() {
String content = "";
FileReader fr = null;
Context context = getActivity();
char[] buffer = new char[1024];
try {
StringBuilder strBuilder = new StringBuilder();
fr = new FileReader(new File(context.getCacheDir(), cacheFileName));
while (fr.read(buffer) != -1) {
strBuilder.append(buffer);
}
fr.close();
content = strBuilder.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (content.length() != 0) {
tvReadCache.setText(content);
} else {
tvReadCache.setText("<内容空>");
}
}
运行效果如下:
上面就是简单地示例。有兴趣的同学参考示例代码。(下载示例代码)