—— 十七岁全力以赴,十八岁好好庆祝,Fighting!
Android数据存储方式
Android数据持久化存储共有四种方式,分别是文件存储、SharedPreferences、Sqlite数据库和ContentProvider。在本篇幅中只介绍前面三种存储方式,因为ContentProvider属于android四大组件之一,所以它的数据存储方式在介绍四大组件的时候说明。
1、文件存储
文件存储不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。文件存储有两种方式,一是存储到手机内存中(memory),一是存储到sd卡中。
1.1 存储到手机内存中
Context类中提供了一个 openFileOutput()方法,可以用于将数据存储到指定的文件中:
1
2
3
4
|
openFileOutput(name, mode): name:是文件名,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/< package name= "" >/files/(等价于 getFilesDir())目 录下 的 mode:是文件的操作模式 ,MODE_PRIVATE:默认的操作模式,同名文件内容会被覆盖。MODE_APPEND则表示 如果该文件已存在就往文件里面追加内容,不存在就创建新文件。 </ package > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
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清掉中添加所需权限
1
2
3
|
<uses-permission android:name= "android.permission.READ_EXTERNAL_STORAGE" > <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission></uses-permission> |
第 2 步:动态申请权限
1
2
|
requestPermissions( new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 101 ); |
第 3 步:使用Environment获取SD目录,读写数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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目录下。
1
2
3
4
5
6
7
8
9
10
11
12
|
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存储在下一篇详细讲解