前言
Android平台提供了5种数据存储方式
- 文件存储:在Android中读取/写入文件的的方法与JAVA中实现I/O程序是完全一样的,提供了openFileput()和openFileOutput()方法读取设备上文件,可以用来存储大数据,如文本,图片,音频等。
- SharePreferences:Android提供用来存储一些简单的配置信息的一种机制,采用XML格式存储数据到设备中,一般用来存储应用程序的各种配置信息,如用户名,密码等。
- SQLite数据库:Android自带的一个轻量级的数据库,支持基本SQL语法,一般用作复杂数据的存储引擎,可以存储用户信息。
- ContentProvider:Android四大组件之一,主要用于应用程序之间的数据交换,可以把自己的数据共享给其他应用程序使用
- 网络存储:需要与Android网络数据包打交道,将数据存储到服务器上,通过网络提供的存储空间来存储/获取信息
文件存储
文件存储是Android最基本的数据存储方式,与JAVA中的文件存储类似,都是通过I/O流的形式把数据存储到文件中。文件存储分为内部存储和外部存储。
内部存储
内部存储是指应用程序中的数据是以文件方式存储在设备内部中(该文件默认位于“data/data//files/”目录下)。内部存储的文件被所创建的应用程序私有,其他应用程序想操作需要设置权限。内部存储的文件会跟随创建的应用程序卸载而删除
数据存储
存储数据采用Context提供的openFileOutput(),该方法用于打开文件的输出流,将数据存储到指定文件中。通过该方法可以获取FileOutputStream对象。
方法原型:
FileOutputStream fos = openFileOutput(String name , int mode);
"name"表示文件名,”mode“表示文件的操作模式
- MODE_PRIVATE:该文件只能被当前程序读写
- MODE_APPEND:该内容可以追加
- MODE_WORLD_READABLE:该文件内容可以被其他程序读
- MODE_WORLE_WRITEABLE:该文件内容可以被其他程序写
默认情况下应用程序创建的文件都是私有的。
存储数据的示例代码:
String saveInfo=et_info.getText().toString().trim(); //把从et_info这个组件中获取的数据转化成字符串类型存入saveInfo变量中
FileOutputStream fos = context.openFileOutput("data.txt",Context.MODE_PRIVATE); //打开data.txt文件的输出流,打开模式为私有
fos.write(saveInfo.getBytes()); //把字符串saveInfo变成字节数组通过输出流写入到数据文件中
fos.close(); //关闭输出流
读取数据
取出数据时,使用FileInputStream对象读取数据,采用Context提供的openFileInput(),该方法用于打开文件的输入流,将数据读取出来
方法原型为
FileInputStream fis = openFileInput(String name);
"name"表示文件名
读取数据示例代码:
FileInputStream fis = context.openFileInput("data.txt"); //获取文件输入流对象
byte[] buffer = new byte [fis.available()]; //创建缓存区,并获取文件长度
fis.read(buffer); //将文件内容读取到buffer缓存区中
String context = new String(buffer); //将buffer中的内容转换成字符串存到context中
fis.close(); //关闭输入流
外部存储
外部存储是指将文件存储到一些外部设备上,例如SD卡或设备内嵌的存储卡,属于永久性存储方式(该文件通常位于mnt/sdcard目录下,不同厂商生产的手机路径可能会不同)。外部存储的文件可以被其他应用程序所共享。由于外部存储设备可能被移除等情况,使用外部设备前必须使用Environment.getExternalStorageState()方法来确认外部设备是否可用,当外部设备可用并且具有读写权限时,可以通过FileInputStream(),FileOutputStream()对象来读写外部设备中的文件。
向外部设备(SD卡)存储数据代码示例
String state = Environment.getExternalStorageState(); //获取外部设备
if(state.equals(Environment.MEDIA_MOUNTED)){ //判断外部设备是否可用
File SDPath = Environment.getExternalStorageDirectory(); //获取SD卡目录
File file = new File(SDPath , "data.txt"); //在SDPath路径下创建data.txt文件
String data = "hello";
FileOutputStream fos = new FileOutputStream(file); //打开文件的输出流
fos.write(data.getBytes()); //写入数据
fos.close; //关闭文件输出流
}