Android:6數(shù)據(jù)存儲_1文件存儲

本文是以Android Studio為開發(fā)工具递宅,<<第一行代碼Anroid第2版>> 為學(xué)習(xí)指導(dǎo)書籍的學(xué)習(xí)記錄

6.1 數(shù)據(jù)的持久化技術(shù)

數(shù)據(jù)持久代就是指那些內(nèi)存中的瞬時(shí)數(shù)據(jù)保存到存儲設(shè)備中伸辟,保證即使在手機(jī)或電腦關(guān)機(jī)的情況下恬吕,這些數(shù)據(jù)仍然不會丟失。
Android有三種方式實(shí)現(xiàn)數(shù)據(jù)持久化功能:

  1. 文件存儲厕鹃;
  2. SharePreferenced存儲河爹;
  3. 數(shù)據(jù)庫存儲变丧。

6.2 文件存儲

文件存儲是Android中最基本的一種數(shù)據(jù)存儲方式,這種方式不對存儲的內(nèi)容進(jìn)行任何的格式化處理狡蝶,數(shù)據(jù)會原封不動地保存到文件中庶橱;
所以這種方法比較適合==一些簡單的文本數(shù)據(jù),如文本數(shù)據(jù)或二進(jìn)制文件==贪惹。

6.2.1 將數(shù)據(jù)存儲到文件中

openFileOutout()方法

Context類中提供了一個(gè)openfileOutput()方法苏章,用于將數(shù)據(jù)存儲到指定的文件中,這個(gè)方法接收兩個(gè)參數(shù):

  • 第一個(gè)參數(shù):指定創(chuàng)建文件的名稱(不包括文件的路徑奏瞬,文件默認(rèn)會存儲到/data/date/<pageage name>/file/目錄下面

  • 第二個(gè)參數(shù):指定文件的操作模式有兩種

    1. MODE_PRIVATE(默認(rèn)模式,當(dāng)保存的文件名一樣時(shí)枫绅,寫入的內(nèi)容會覆蓋原文件的內(nèi)容)
    2. MODE_APPEND(當(dāng)保存的文件名一樣時(shí),寫入的內(nèi)容會在原文件的內(nèi)容進(jìn)入追加硼端。)

openfileOutput()方法返回的是一個(gè)FileOutputStream對象撑瞧,得到這個(gè)對象后就可以使用==Java流的方式==將數(shù)據(jù)寫入到文件中如下java 示例:

    public void save(){
        String data = "Data to save";
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try{
            out = openFileOutput("data", 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) {
                e.printStackTrace();
            }
        }
    }

    private FileOutputStream openFileOutput(String data, int modePrivate) {

    }

新建一個(gè)“FilePersistenceTest”項(xiàng)目,
修改activity_main.xml文件的代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    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:text="Type something here"/>

    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="保存數(shù)據(jù)"
        />
</LinearLayout>

修改MainActivity類的代碼如下:

package com.zyf.android.filepersistencetest;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class MainActivity extends AppCompatActivity {
    //聲明一個(gè)EditText對象
    private EditText edit;

    private Button button_obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit = (EditText) findViewById(R.id.edit);//獲取實(shí)例
        button_obj = (Button) findViewById(R.id.button_1);
        button_obj.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("SecondActivity", "123131231231231");
                String inputText = edit.getText().toString();
                Log.i("SecondActivity", inputText);
                save(inputText);
            }
        });
    }
     
    //窗口銷毀后響應(yīng)OnDestroy();
    protected void onDestroy(){
        super.onDestroy();
    }

    //保存數(shù)據(jù)的方法
    public void save(String inputText){
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try{
            out = openFileOutput("data2.txt", Context.MODE_PRIVATE);
            Log.i("SecondActivity", "out");

            writer = new BufferedWriter(new OutputStreamWriter(out));
            Log.i("SecondActivity", "writer");

            writer.write(inputText);//執(zhí)行寫入數(shù)據(jù)的方法
        }catch (IOException e){
            Log.i("SecondActivity", "IOException1");
            e.printStackTrace();
            //對異常進(jìn)行處理

        }finally {
            try{
                if (writer != null){
                    writer.close();
                    Log.i("SecondActivity", "writer is close");
                }
            }catch (IOException e){
                Log.i("SecondActivity", "IOException1");
                e.printStackTrace();
            }
        }

    }
}

查看保存的文件
借助Android device Monitor 工具(點(diǎn)擊AS,右下角的Android device Monitor)會打開一個(gè)列表显蝌。

打開data>data>項(xiàng)目的包名>files>保存文件的名字


15269227328316.jpg

6.2.2 從文件中讀取數(shù)據(jù)

使用openFileInput()方法,獲取一個(gè)FileInputStream對象订咸,再建一個(gè)InputStreamReader對象曼尊,接著構(gòu)建BufferedReader對象,讀取文字并存放到StringBuilder 對象中去脏嚷。
修改MainActivity 代碼如下骆撇;

package com.zyf.android.filepersistencetest;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class MainActivity extends AppCompatActivity {
    //聲明一個(gè)EditText對象
    private EditText edit;
    private Button button_obj;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit = (EditText) findViewById(R.id.edit);//獲取實(shí)例

        String inputText = load();
        if (!TextUtils.isEmpty(inputText)){
            edit.setText(inputText);
            edit.setSelection(inputText.length());
            Toast.makeText(this,"Restoring succeeded",Toast.LENGTH_SHORT).show();
        }

        button_obj = (Button) findViewById(R.id.button_1);
        button_obj.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("SecondActivity", "123131231231231");
                String inputText = edit.getText().toString();
                Log.i("SecondActivity", inputText);
                save(inputText);
            }
        });
    }

    //加載文件的方法
    private String load() {
        FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            in = openFileInput("data2.txt");
            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();
    }

    //窗口銷毀后響應(yīng)OnDestroy();
    protected void onDestroy(){
        super.onDestroy();
    }

    //保存數(shù)據(jù)的方法
    public void save(String inputText){
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try{
            out = openFileOutput("data2.txt", Context.MODE_PRIVATE);
            Log.i("SecondActivity", "out");

            writer = new BufferedWriter(new OutputStreamWriter(out));
            Log.i("SecondActivity", "writer");

            writer.write(inputText);//執(zhí)行寫入數(shù)據(jù)的方法
        }catch (IOException e){
            Log.i("SecondActivity", "IOException1");
            e.printStackTrace();
            //對異常進(jìn)行處理

        }finally {
            try{
                if (writer != null){
                    writer.close();
                    Log.i("SecondActivity", "writer is close");
                }
            }catch (IOException e){
                Log.i("SecondActivity", "IOException1");
                e.printStackTrace();
            }
        }
    }
}

再運(yùn)行代碼就可以了

寫在最后
本示例源碼下載百度云地址

  1. SharePreferenced存儲;(20180523已更新父叙,http://www.reibang.com/p/2e4b470c8373)
  2. 數(shù)據(jù)庫存儲神郊。

這兩種存儲還在學(xué)習(xí),明天更新趾唱,敬請期侍涌乳!互勉!

zhangyongfeng"s blogs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甜癞,一起剝皮案震驚了整個(gè)濱河市夕晓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悠咱,老刑警劉巖蒸辆,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異析既,居然都是意外死亡躬贡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門眼坏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拂玻,“玉大人,你說我怎么就攤上這事》慕玻” “怎么了擂仍?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熬甚。 經(jīng)常有香客問我逢渔,道長,這世上最難降的妖魔是什么乡括? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任肃廓,我火速辦了婚禮,結(jié)果婚禮上诲泌,老公的妹妹穿的比我還像新娘盲赊。我一直安慰自己,他們只是感情好敷扫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布哀蘑。 她就那樣靜靜地躺著,像睡著了一般葵第。 火紅的嫁衣襯著肌膚如雪绘迁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天卒密,我揣著相機(jī)與錄音缀台,去河邊找鬼。 笑死哮奇,一個(gè)胖子當(dāng)著我的面吹牛膛腐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鼎俘,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼哲身,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了而芥?” 一聲冷哼從身側(cè)響起律罢,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棍丐,沒想到半個(gè)月后误辑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歌逢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年巾钉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秘案。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砰苍,死狀恐怖潦匈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赚导,我是刑警寧澤茬缩,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站吼旧,受9級特大地震影響凰锡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圈暗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一掂为、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧员串,春花似錦勇哗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渺鹦,卻和暖如春瞧栗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背海铆。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挣惰,地道東北人卧斟。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像憎茂,于是被迫代替她去往敵國和親珍语。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容