Android数据存储之文件存储
Android中实现数据存储的三种方式:
1、文件存储
2、SharedPreference存储
3、SQLite数据库存储
下面给出三种方式的数据文件默认存储的位置:
数据存储方式下面给出存储的位置以及导出的方式
存储位置以及导出.png文件存储
文件存储是Android中最基本的一种存储方式,和Java中实现I/O的方式,由Context类提供openFileInput()和openFileOutput()方法打开。文件存储主要分两种存储,一种是内部存储,一种是外部存储。
- 内部存储
使用了FileInputStream类中的openFileInput()方法,用于读取数据;使用了FileOutputStream类中的openFileOutput()方法,用于写入数据。
- 外部存储
使用Enviroment类中的getExternalStorageDirectory()方法对外部存储上的文件进行读写。
注意:写入时需要添加写入权限
内部存储
- 存储数据
1、通过openFileOutput(String name, int mode)来返回一个
FileOutputStream对象
2、通过调用fileOutputStream.write(content.getBytes());来进行写入
write(byte b[])可以看出这里存储的不是String,而是通过字节的形式进行存储的
3、调用fileOutputStream.flush();因为write()方法是写入缓冲区的,调用flush()方法将缓冲中的数据写入到文件,清空缓存
4、最后调用close来将流关闭:fileOutputStream.close();
//存储数据
private void Save(String content) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = openFileOutput(mFileName, MODE_PRIVATE);
fileOutputStream.write(content.getBytes());
fileOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 读取数据
1、通过openFileInput(String name)来返回一个FileInputStream对象
2、byte[] buff = new byte[1024];这里是每1024个字节进行读取一次
3、StringBuffer sb = new StringBuffer();创建StringBuffer来进行字符串的拼接
4、最后调用close来将流关闭:fileInputStream.close();
//读取数据
private String read() {
FileInputStream fileInputStream = null;
try {
fileInputStream = openFileInput(mFileName);
byte[] buff = new byte[1024];
StringBuffer sb = new StringBuffer();
int len = 0;
while ((len = fileInputStream.read(buff)) > 0) {
sb.append(new String(buff, 0, len));
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
内部存储.gif
存储的文件.png
外部存储
- 前言
其实外部存储方式和内部存储区别不是很大 只是存储的位置发生了变化,内部存储用户是看不到存储的数据,而外部存储是存储到手机外置内存中 是可以查看到存储的数据
- 存储数据
前提需要进行写入权限的申请
//外部存储数据
private void fileSave(String content) {
FileOutputStream fileOutputStream = null;
try {
//第一步先创建文件夹
File dir = new File(Environment.getExternalStorageDirectory(), "dongbo");
if (!dir.exists()) {
//判断文件夹是否存在 若不存在,则创建文件夹
dir.mkdirs();
}
//第二部创建文件
File file = new File(dir, mFileName);
if (!file.exists()) {
//判断文件是否存在 若不存在,则创建文件
file.createNewFile();
}
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(content.getBytes());
fileOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 读取数据
//读取外部数据
private String fileRead() {
FileInputStream fileInputStream = null;
try {
// fileInputStream = openFileInput(mFileName);
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dongbo", mFileName);
fileInputStream = new FileInputStream(file);
byte[] buff = new byte[1024];
StringBuffer sb = new StringBuffer();
int len = 0;
while ((len = fileInputStream.read(buff)) > 0) {
sb.append(new String(buff, 0, len));
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
总结文件存储
-
存储路径
存储路径.png1、mContext.getFilesDir().getAbsolutePath() 内部存储的File路径
2、mContext.getCacheDir().getAbsolutePath() 内部存储的缓存路径
3、mContext.getDir("project", MODE_PRIVATE) 创建新的文件路径
4、Environment.getExternalStorageDirectory().getAbsolutePath() 外部存储的路径
5、mContext.deleteFile(mFileName);//删除指定文件
-
mode操作模式 分两种:
MODE_APPEND(文件创建模式,在openFileOuput方法中使用,如果文件存在,那么会在已存在的文件后面接着写入数据,而不是删除已存在的数据。)大家可以看到这里的数据不是将之前的数据删除之后重新创建,而是直接进行添加
MODE_PRIVATE(文件创建模式,默认的模式,用这个模式创建的文件只能被当前调用的应用程序访问。(或者所有拥有相同UID的应用,这个UID其实就是每个进程的UID,也就是说同一进程访问,这里涉及到多进程的知识,在此不详细展开了))
说明:
自Api17以来,常量MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE已经被弃用。
从Android N开始,使用这些常量会引发securityException。
这意味着,面向Android N 和更高版本的应用无法按名称共享私有文件,尝试共享file://URL将会导致引发FileUriExposedException。
如果应用需要与其他应用共享私有文件,则可以将FileProvider与FLAG_GRANT_READ_URI_PERMISSION配合使用。
- 涉及用户
当用户卸载应用之后,内部存储的文件也会随之卸载而删除,而外部存储则不会删除
- 存储的范围
存储的数据可以是文本、照片、pdf文件,但是需要注意的是都需要把数据转换成字节的形式来进行写入,读取的时候也是根据字节的形式来读取,将数据转换成指定类型的数据
若有不足,请大家指教
数据存储相关文章
Android数据存储之文件存储
Android数据存储之SharedPreferences
Android数据存储之SQLite存储