第六章 數據存儲java
6.1 持久化技術android
持久化技術指將內存中的瞬時數據保存到存儲設備中,保證即便在手機或電腦關機的狀況下,這些數據仍然不會丟失。數據庫
主要有三種方式用於簡單地實現數據持久化功能:文件存儲、SharedPreferences存儲以及數據庫存儲。app
6.2 文件存儲ide
android中最基礎的一種數據存儲方式,不對存儲內容作任何格式化處理,比較適合存儲一些簡單的文本數據或二進制數據。ui
6.2.1 將數據存儲到文件中this
建立一個新項目FilePersistenceTestspa
a.修改activity_main中的代碼,加入一個EditTextcode
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Type Something Here"/> </LinearLayout>
b.修改MainActivity.java中的代碼xml
openFileOutput()方法能夠用於將數據存儲到指定文件中,接收兩個參數,第一個爲文件名,不包含路徑,第二個爲文件的操做模式,MODE_PRIVATE和MODE_APPEND。該方法返回一個FIleOutputStream對象。再借助它構建出一個OutputStreamWriter對象,接着再用OutputStreamWriter構建出一個BufferedWriter對象,而後經過BufferedWriter來將文本內容寫入文件。
out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(input);
在onDestroy()方法中加入save方法,保證在數據被回收以前,將它存儲到文件當中。
private EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit = (EditText) findViewById(R.id.edit); }
@Override protected void onDestroy() { super.onDestroy(); String inputText = edit.getText().toString(); save(inputText); } public void save(String input){ FileOutputStream out = null; BufferedWriter writer = null; try{ out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(input); }catch(IOException e){ e.printStackTrace(); }finally{ try { if (writer != null) { writer.close(); } }catch(IOException e){ e.printStackTrace(); } } }
運行程序:
輸入以後,經過Tools——>Android———>Android Device Monitor
在File Explorer標籤頁中找到/data/data/com.example.song.filepersistencetest/file/目錄,將data文件導出
用記事本打開該文件便可看到內容。
6.2.2 從文件中讀取數據
修改MainActivity中的方法
經過openFileInput()方法得到一個FileInputStream對象,而後藉助它構建出一個InputSteamReadder對象,接着再使用InputStreamReader構建出一個BufferedReader對象,經過BufferedReader進行一行行地讀取,把文件中的全部內容讀取出來,並存放在StringBuilder對象中,最後返回讀取的對象。
注意的方法:
1.reader.readLine() 讀取文件中的一行字符串
2.TextUtils.isEmpty()方法能夠一次性對兩種空值進行判斷,當傳入的字符串等於null或者等於空字符串時,這個方法都會返回true
3..setSelection()方法將輸入光標移動到文本的末尾位置以便繼續輸入。
public class MainActivity extends AppCompatActivity { private EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit = (EditText) findViewById(R.id.edit); String inputText = load(); if(!TextUtils.isEmpty(inputText)){ edit.setText(inputText); edit.setSelection(inputText.length()); Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show(); } }
public String load() { StringBuilder builder = new StringBuilder(); FileInputStream in = null; BufferedReader reader = null; try { in = openFileInput("data"); reader = new BufferedReader(new InputStreamReader(in)); String line = ""; while ((line = reader.readLine()) != null) { builder.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return builder.toString(); } }
運行程序:
總結:
存儲文件和讀取文件的核心:
存儲數據到文件文件:
用openFileOutput()方法建立FileOutputStream對象,再借助它構建出一個OutputStreamWriter對象,接着再用OutputStreamWriter構建出一個BufferedWriter對象,而後經過BufferedWriter來將文本內容寫入文件。
out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(input);
從文件中讀取數據:
經過openFileInput()方法得到一個FileInputStream對象,而後藉助它構建出一個InputSteamReadder對象,接着再使用InputStreamReader構建出一個BufferedReader對象,經過BufferedReader進行一行行地讀取,把文件中的全部內容讀取出來,並存放在StringBuilder對象中,最後返回讀取的對象。
in = openFileInput("data"); reader = new BufferedReader(new InputStreamReader(in));