—— 十七岁全力以赴,十八岁好好庆祝,Fighting!
Android数据存储方式
Android数据持久化存储共有四种方式,分别是文件存储、SharedPreferences、Sqlite数据库和ContentProvider。在本篇幅中只介绍前面三种存储方式,因为ContentProvider属于android四大组件之一,所以它的数据存储方式在介绍四大组件的时候说明。
1、文件存储
文件存储不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。文件存储有两种方式,一是存储到手机内存中(memory),一是存储到sd卡中。
1.1 存储到手机内存中
Context类中提供了一个 openFileOutput()方法,可以用于将数据存储到指定的文件中:
| 1234 | ``openFileOutput(name, mode):`` ``name:是文件名,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<``package name=``""``>/files/(等价于 getFilesDir())目 录下 的`` ``mode:是文件的操作模式 ,MODE_PRIVATE:默认的操作模式,同名文件内容会被覆盖。MODE_APPEND则表示 如果该文件已存在就往文件里面追加内容,不存在就创建新文件。``</``package``> |
|---|
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 | public void save(String data) {`` ``FileOutputStream out = ``null``;`` ``BufferedWriter writer = ``null``;`` ``try {`` ``out = openFileOutput(``"content"``, Context.MODE_PRIVATE);`` ``writer = ``new BufferedWriter(``new OutputStreamWriter(out));`` ``writer.write(data);`` ``} ``catch (IOException e) {`` ``e.printStackTrace();`` ``} ``finally {`` ``try {`` ``if (writer != ``null``) {`` ``writer.close();`` ``}`` ``} ``catch (IOException e) {`` ``}`` ``}``}``public String read() {`` ``FileInputStream in = ``null``;`` ``BufferedReader reader = ``null``;`` ``StringBuilder content = ``new StringBuilder();`` ``try {`` ``in = openFileInput(``"content"``);`` ``reader = ``new BufferedReader(``new InputStreamReader(in));`` ``String line = ``""``;`` ``while ((line = reader.readLine()) != ``null``) {`` ``content.append(line);`` ``}`` ``} ``catch (IOException e) {`` ``e.printStackTrace();`` ``} ``finally {`` ``if (reader != ``null``) {`` ``try {`` ``reader.close();`` ``} ``catch (IOException e) {`` ``e.printStackTrace();`` ``}`` ``}`` ``}`` ``return content.toString();``} |
|---|
1.2 存储到手机SD卡中
前面说的存储到手机内存,数据是存储在应用程序内的,文件大小受到限制,而且数据随着程序的卸载而自动清除;当要存储大的文件时,或者想数据不会随着程序的卸载而自动清除就可以使用sd卡方式存储了。使用sd卡存储主要是使用Environment这个类的功能。
注:在Android6.0之后读写SD卡等危险的操作需要动态申请存储等权限。否则可能会报异常java.io.FileNotFoundException: /storage/emulated/0/test: open failed: EACCES (Permission denied)
第 1 步:在AndroidManifest清掉中添加所需权限
| 123 | ``<uses-permission android:name=``"android.permission.READ_EXTERNAL_STORAGE"``>`` ``<uses-permission android:name=``"android.permission.WRITE_EXTERNAL_STORAGE"``>``</uses-permission></uses-permission> |
|---|
第 2 步:动态申请权限
| 12 | requestPermissions(``new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, ``101``); |
|---|
第 3 步:使用Environment获取SD目录,读写数据:
| 1234567891011121314151617181920212223242526272829303132333435363738 | public void save(String data) {`` ``try {`` ``// 获取SDcard路径`` ``File sdCardDir = Environment.getExternalStorageDirectory();`` ``// SDCard目录:/mnt/sdcard`` ``String sdcardPath = sdCardDir.getAbsolutePath();`` ``File file = ``new File(sdCardDir, ``"test"``);`` ``RandomAccessFile raf = ``new RandomAccessFile(file, ``"rw"``);`` ``// 将文件记录指针移动最后`` ``raf.seek(file.length());`` ``// 输出文件内容`` ``raf.write(data.getBytes());`` ``raf.close();`` ``} ``catch (Exception e) {`` ``e.printStackTrace();`` ``}``}``public String read() {`` ``StringBuilder sb = ``new StringBuilder();`` ``// 获取SDcard路径`` ``try {`` ``File sdCardDir = Environment.getExternalStorageDirectory();`` ``File file = ``new File(sdCardDir, ``"test"``);`` ``InputStream inputStream = ``new FileInputStream(file);`` ``int len = ``0``;`` ``byte``[] buffer = ``new byte``[``1024``];`` ``while ((len = inputStream.read(buffer)) != -``1``) {`` ``sb.append(``new String(buffer, ``0``, len));`` ``}`` ``// 关闭流`` ``inputStream.close();`` ``} ``catch (Exception e) {`` ``e.printStackTrace();`` ``}`` ``return sb.toString();``} |
|---|
2、SharedPreferences存储
SharedPreferences类,它是一个轻量级的存储类,适合用于保存软件配置参数。SharedPreferences是使用键值对的方式来存储数据的,存储数据是以xml文件形式存储,文件存放在/data/data/your package name/shared_prefs目录下。
| 123456789101112 | public void save(String data) {`` ``SharedPreferences preferences = getSharedPreferences(``"test"``, MODE_APPEND);`` ``SharedPreferences.Editor editor = preferences.edit();`` ``editor.putString(``"content"``, data);`` ``editor.commit();``}``public String read() {`` ``SharedPreferences preferences = getSharedPreferences(``"test"``, MODE_PRIVATE);`` ``return preferences.getString(``"content"``, ``""``);``} |
|---|
SQLite存储在下一篇详细讲解