继续上一篇的内容,Androidd 的数据存储方式之:SharedPreferences。
SharedPerferences 是一个轻量级的存储类,一般用来存储一些简单的参数。数据以xml文件的方式存储,放在/data/data/<package name>/shared_prefs 目录下
SharedPreferences的使用非常简单,通常有两种方法去获取它:
一种是通过Context对象的 getSharedPerferences()获取的SharedPerferences对象可以被整个应用所使用
另一种是通过Activity对象的 getSharedPerferences()获取的SharedPerferences对象只能被当前Activity所使用
SharedPerferences对象的获取为:
代码如下:
<span style="font-family:FangSong_GB2312;font-size:18px;">/*两个参数
//参数一:为保存的xml的文件名
//参数二:为操作方式
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.
*/
SharedPreferences shardPreference = this.getSharedPreferences("SPDemo",Context.MODE_APPEND);
//用Context 的方式获取
//SharedPreferences sharedPreferences2 = getApplication().getSharedPreferences("spdemo",Context.MODE_APPEND);
SharedPreferences.Editor editor = shardPreference.edit();
editor.putString("name","Linliterwhite");
editor.commit();</span>
以上是对SharedPerferences进行存储数据,接下来我们来读取其中的数据。
//首先获取SharedPerferences对象,然后通过getXXX() 方法通过匹对键获取相应的值
SharedPreferences getData= this.getSharedPreferences("SPDemo",Context.MODE_APPEND);
String name = getData.getString("name",null);
到这里SharedPerferences就介绍完了,那么对于初学者可能有一个地方不懂的就是Editor 这个对象是什么鬼?
官方api解释:
Interface used for modifying values in a SharedPreferences object. All changes you make in an editor are batched, and not copied back to the original SharedPreferences or persistent storage until you call commit().
大意就是:editor是一个用来改变SharedPerferences对象中的值的接口,你可以在改变SharedPerferences中的值直到使用commit() 方法后。(英语水平很一般,粗略翻译)
在上面大家也可以看到,editor的使用和Map有点类似,都是健值对应的。所以初学者前期可以把它看成类似于map的专属于SharedPerferences中的数据类型。
接下来我来接受文件存储
文件存储,数据以 I/O 流的形式把数据存入手机内存或者手机SD卡,可以存储大数据,如音乐,图片,视频等。
文件存储其实就是把Java中的文件操作应用到Android手机。说到底就是I/O操作,文件默认会存储到/data/data/package/files中。
文件操作需要以下权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
需要知道的两个概念
当数据从内存传入硬盘时,为输出流
但数据从硬盘传入内存时,为输入流
直接贴代码
String fileData = "This is Test!";
try {
//获取一个名为FileDemo 的文件,第二个参数与SharedPerferences相似
/*参数二:为操作方式
1.Context.MODE_PRIVATE:私有覆盖模式
只能被当前应用访问,并且如果写入,则覆盖;
2.Context.MODE_APPEND:私有追加模式
只能被当前应用访问,并且如果写入,则追加;
3.Context,MODE_WORLD_READABLE:公有只读模式
可以被其他应用读取;
4.Context.MODE_WORLD_WRITEABLE:公有可写模式
可以被其他应用写入,但不能读取;
注意,如果希望其他使得文件模式叠加,则可以使用加号连接;
比如:Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE 表示其他应用读写;
*/
FileOutputStream outputStream = openFileOutput("FileDemo",Context.MODE_APPEND);
// I/O操作,调用write() 方法,直接写入
outputStream.write(fileData.getBytes());
outputStream.close();//最后不要忘记关闭输出流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
文件写入数据
try {
//获取名为FileDemo 的文件的输入流
FileInputStream inputStream = openFileInput("FIleDemo");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte b[] = new byte[1024];
int len = 0;
while((len = inputStream.read(b))!=-1){
byteArrayOutputStream.write(b);
}
inputStream.close();
byteArrayOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
以上文件操作都类似Java的文件I/O操作,但Android手机还有一点就是有sd卡。很多文件我们应该放到sd卡,不然会占用手机存储空间,这时我们就得判断手机是否有sd卡。使用
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 就可以判断是否有sd卡
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File f = new File(Environment.getExternalStorageDirectory(),"SDFile");
FileOutputStream out = null;
try {
out = new FileOutputStream("SDFile",true);
out.write(fileData.getBytes("UTF-8"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
File fin = new File(Environment.getExternalStorageDirectory(),"SDFile");
try {
FileInputStream fileInputStream = new FileInputStream(fin) ;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bb = new byte[1024];
int len = 0;
while((len = fileInputStream.read(bb))!=-1){
byteArrayOutputStream.write(bb);
}
fileInputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
相比之下,大家可以看到,差别就是SD卡的存储多了一个获取绝对路径:
Environment.getExternalStorageDirectory()
其他都是一样的!