Android数据存储方式
SharedPrefrence存储
说明
SP存储专门用来存储一些单一的小数据
存储数据的类型: boolean, float, int, long, String
数据保存的路径: /data/data/packageName/shared_prefs/yyy.xml
可以设置数据只能是当前应用读取, 而别的应用不可以
应用卸载时会删除此数据
相关API
SharedPreferences: 对应sp文件的接口
context. getSharedPreferences (String name, int mode): 得到SP对象
name: 文件名(不带.xml)
mode: 生成的文件模式(是否是私有的,即其它应用是否可以访问)
Editor sp.edit() : 得到Editor对象
Xxx sp.getXxx(name,defaultValue): 根据name得到对应的数据
Editor : 能更新sp文件的接口
Editor put(name, value) : 保存一个键值对, 没有真正保存到文件中
Editor remove(name)
commit(): 提交, 数据真正保存到文件中了
手机内部文件存储
说明
应用运行需要的一些较大的数据或图片可以用文件保存的手机内部
文件类型: 任意
数据保存的路径: /data/data/projectPackage/files/
可以设置数据只能是当前应用读取, 而别的应用不可以
应用卸载时会删除此数据
相关API
读取文件
FileInputStream fis = openFileInput(“logo.png”);
保存文件
FileOutputStream fos = openFileOutput(“logo.png”, MODE_PRIVATE)
得到files文件夹对象
File filesDir = getFilesDir();
操作asserts下的文件
得到AssetManager : context.getAssets();
读取文件: InputStream open(filename);
加载图片文件
Bitmap BitmapFactory.decodeFile(String pathName) // .bmp/.png/.jpg
比如保存并读取assets下的代码
public void save(View view) throws IOException {
//1. 得到InputStream-->读取assets下的logo.png
//得到AssetManager
AssetManager manager = getAssets();
//读取文件
InputStream is = manager.open("logo.png");
//2. 得到OutputStream-->/data/data/packageName/files/logo.png
FileOutputStream fos = openFileOutput("logo.png", MODE_PRIVATE);
//3.边读边写
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer);
}
//4.关闭
is.close();
fos.close();
//5.提示
Toast.makeText(this, "保存成功", Toast.LENGTH_LONG).show();
}
public void read(View view) {
//1. 得到图片文件的路径
// /data/data/packageName/files
String filePath = getFilesDir().getAbsolutePath();
String path = filePath + "/logo.png";
//2. 读取加载图片文件得到bitmap对象
Bitmap bitmap = BitmapFactory.decodeFile(path);
//3.设置图片
iv_if.setImageBitmap(bitmap);
}
手机外部文件存储
说明
应用运行用到的数据文件(如图片)可以保存到sd卡中
文件类型: 任意
数据保存的路径:
路径1: /storage/sdcard/Android/data/packageName/files/
路径2: /storage/sdcard/xxx/
路径1 :其它应用可以访问,应用卸载时删除
路径2 : 其它应用可以访问, 应用卸载时不会删除
必须保证sd卡挂载在手机上才能读写, 否则不能操作
相关API
Environment : 操作SD卡的工具类
得到SD卡的状态:Environment.getExternalStorageState()
得到SD卡的路径:Environment.getExternalStorageDirectory()
SD卡可读写的挂载状态值:Environment.MEDIA_MOUNTED
context. getExternalFilesDir():
得到/mnt/sdcard/Android/data/pageckage_name/files/xxx.txt
操作SD卡的权限:
android.permission.WRITE_EXTERNAL_STORAGE
实现文件保存——路径1:其它应用可以访问,应用卸载时删除
public void save(View view) throws Exception {
//1. 判断sd卡状态, 如果是挂载的状态才继续, 否则提示
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//2. 读取输入的文件名/内容
String fileName = et_of_name.getText().toString();
String content = et_of_content.getText().toString();
//3. 得到指定文件的OutputStream
//1).得到sd卡下的files路径
String filePath = getExternalFilesDir(null).getAbsolutePath();
//2).组成完整路径
String path = filePath + "/" + fileName + ".txt";
//3). 创建FileOutputStream
FileOutputStream fos = new FileOutputStream(path);
//4. 写数据
fos.write(content.getBytes("utf-8"));
fos.close();
//5.提示
Toast.makeText(this, "保存成功", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_LONG).show();
}
}
public void read(View view) throws Exception {
//1. 判断sd卡状态, 如果是挂载的状态才继续, 否则提示
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//2. 读取输入的文件名/内容
String fileName = et_of_name.getText().toString();
//3. 得到指定文件的InputStream
//1).得到sd卡下的files路径
String filePath = getExternalFilesDir(null).getAbsolutePath();
//2).组成完整路径
String path = filePath + "/" + fileName + ".txt";// 1.txt
//3). 创建FileInputStream
FileInputStream fis = new FileInputStream(path);
//4. 读数据 OutputStream提供了write方法来做数据的输出,这个是和InputStream是相对应的。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String content = baos.toString();
//5.提示
et_of_content.setText(content);
} else {
Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_LONG).show();
}
}
文件保存——路径2:其他应用可以访问,应用卸载后不删除
// /storage/sdcard/dongge/xxx.txt
public void save2(View v) throws IOException {
//1. 判断sd卡状态, 如果是挂载的状态才继续, 否则提示
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//2. 读取输入的文件名/内容
String fileName = et_of_name.getText().toString();
String content = et_of_content.getText().toString();
//3. 得到指定文件的OutputStream
//1).得到sd卡下的files路径:/storage/sdcard/xxx/
String filePath = Environment.getExternalStorageDirectory().getPath();
String sdPath = filePath + "/dongge";
File file = new File(sdPath);
if (!file.exists()) {
//创建文件夹
file.mkdirs();
}
//2).组成完整路径
String path = filePath + "/dongge/" + fileName + ".txt";
//3). 创建FileOutputStream
FileOutputStream fos = new FileOutputStream(path);
//4. 写数据
fos.write(content.getBytes("utf-8"));
fos.close();
//5.提示
Toast.makeText(this, "保存成功", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_LONG).show();
}
}
public void read2(View view) throws Exception {
//1. 判断sd卡状态, 如果是挂载的状态才继续, 否则提示
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//2. 读取输入的文件名/内容
String fileName = et_of_name.getText().toString();
//3. 得到指定文件的InputStream
//1).得到sd卡下的files路径
String filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
//2).组成完整路径
String path = filePath + "/dongge/" + fileName + ".txt";
//3). 创建FileInputStream
FileInputStream fis = new FileInputStream(path);
//4. 读数据 OutputStream提供了write方法来做数据的输出,这个是和InputStream是相对应的。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String content = baos.toString();
//关闭
baos.close();
fis.close();
//5.提示
et_of_content.setText(content);
} else {
Toast.makeText(this, "sd卡没有挂载", Toast.LENGTH_LONG).show();
}
}