Android的数据存储方式|Android的数据存储方式(二)

继续上一篇的内容,Androidd 的数据存储方式之:SharedPreferences。
SharedPerferences 是一个轻量级的存储类,一般用来存储一些简单的参数。数据以xml文件的方式存储,放在/data/data//shared_prefs 目录下
SharedPreferences的使用非常简单,通常有两种方法去获取它:
一种是通过Context对象的 getSharedPerferences()获取的SharedPerferences对象可以被整个应用所使用
另一种是通过Activity对象的 getSharedPerferences()获取的SharedPerferences对象只能被当前Activity所使用
SharedPerferences对象的获取为:
代码如下:

/*两个参数 //参数一:为保存的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();




以上是对SharedPerferences进行存储数据,接下来我们来读取其中的数据。

//首先获取SharedPerferences对象,然后通过getXXX() 方法通过匹对键获取相应的值 SharedPreferences getData= https://www.it610.com/article/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中。
文件操作需要以下权限


需要知道的两个概念
当数据从内存传入硬盘时,为输出流
但数据从硬盘传入内存时,为输入流
直接贴代码

String fileData = "https://www.it610.com/article/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()

其他都是一样的!

好的,今天就到这啦,鄙人新手,博文中有错的,欢迎大家指出!晚安!
今天2016.10.22,台风海马登陆成功,袭击汕头,














【Android的数据存储方式|Android的数据存储方式(二)】











    推荐阅读