当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢?
数据存储方式
Android 的数据存储有5种方式:
1. SharedPreferences存储数据
SharedPreferences数据存储,也叫作xml存储。这是将数据存储“data/data/程序包名/share_prefs”路径下的到xml文件中。
相关连接:《Android中数据存储——SharedPreferences存储数据 》
2. 文件存储数据
分为内部储存和外部存储。内部存储是应用程序使用Android为自己分配的内存空间,数据存储到“/data/data/程序包名/files”路径下的相应文件中。外部存储是使用手机sdcard的内存(这个sdcard并不是我们经常说的那个可以拆卸替换的SD卡,那个SD卡我们称之为扩展卡),使用这部分内存要声明相应的权限。
相关连接:《Android中数据存储——文件存储数据》
3. SQLite数据库存储数据
使用数据库进行存储,这个一般数据量比较大的时候。
相关连接:《Android中数据存储——SQLite数据库存储数据 》
4. 使用ContentProvider存储数据
这个比较眼熟,ContentProvider也是Android的四大组件之一。ContentProvider一般是第三方提供的数据存储方式,向我们手机中的通讯录联系人,照片,音乐等……
相关连接:《Android中数据存储——ContentProvider存储数据 》
5. 网络存储数据
这个是将数据上传到网络上进行存储。
下面进入我们今天的主要内容,使用文件存储数据。
文件存储数据
文件存储是Android中最基本的一种存储方式,他不对存储的内容进行任何格式化的处理,所有的数据都是原封不动的保存在文件中的,因此他比较适合于存储一些简单的二进制数据或文本数据。
文件存储也分两种:内部存储和外部存储。
内部存储
指Android为应用程序分配的内存。
通过Context类中封装好的输入流和输出流的获取方法获得数据/data/data//files目录下存储的数据。
files目录下写数据
通过Context的封装好的方法 openFileOutput(String filename, int mode)获得数据流:
String filename参数:在/data/data//files目录下存储时的文件名。
int mode参数:文件的操作模式,主要有两种模式可选择:MODE_PRIVATE, MODE_APPEND。默认为MODE_PRIVATE,当指定相同文件名进行读写的时候,新的内容会覆盖原有内容;MODE_APPEND模式会在已存在的文件的最后追加新的内容。除此之外有两种模式:MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE,这两种模式表示允许其他应用程序对我们的程序文件进行读写操作。
try {
FileOutputStream fileOutputStream = openFileOutput("cache_text", MODE_PRIVATE);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(fileOutputStream));
writer.write("你好缓存!");
writer.flush();
writer.close();
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
files目录下读数据
通过Context的封装好的方法 openFileInput(String filename)获得数据流:
String filename参数:在/data/data//files目录下读取时的文件名。
try {
FileInputStream fileInputStream = openFileInput("cache_text");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String line = bufferedReader.readLine();
while (line != null) {
Log.d("data", "" + line);
line = bufferedReader.readLine();
}
bufferedReader.close();
fileInputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
通过Context类中getCacheDir()方法获得”/data/data//cache“目录,创建相关的文件存储数据。
cache目录下写数据
File file = new File(getCacheDir(), "cache_dir_text");//创建/data/data//cache/cache_dir_text文件对象。
if (!file.exists()) {
try {
file.createNewFile();//如果文件不存在,则创建
FileOutputStream fos = new FileOutputStream(file);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(fos));
writer.write("你好缓存!啊啊啊啊");
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
cache目录下读数据
File file = new File(getCacheDir(), "cache_dir_text");
try {
FileInputStream fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line = br.readLine();
while(line!=null){
Log.d("data", " " + line);
line = br.readLine();
}
br.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
外部存储
手机的内存空间,手机内置sdCard(非扩展卡)。使用外部存储要在AndroidManifext.xml中加入访问权限:
写数据
//创建sccard_text文件对象,由于不同手机SDcard目录不同,所以我们通过Environment.getExternalStorageDirectory()获得路径。
File file = new File(Environment.getExternalStorageDirectory(), "sccard_text");
if (!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
FileOutputStream fos =new FileOutputStream(file);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
bw.write("你好啊");
bw.flush();
bw.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
读数据
File file = new File(Environment.getExternalStorageDirectory(), "sccard_text");
try {
FileInputStream fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line = br.readLine();
while(line!=null){
Log.d("data", " " + line);
line = br.readLine();
}
br.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}