Android數據存儲-文件操作


一、預備知識

1.Android中的MVC設計模式

        MVC (Model-View-Controller):M是指邏輯模型,V是指視圖模型,C則是控制器。一個邏輯模型可以對於多種視圖模型,比如一批統計數據你可以分別用柱狀圖、餅圖來表示。一種視圖模型也可以對於多種邏輯模型。使用MVC的目的是將M和V的實現代碼分離,從而使同一個程序可以使用不同的表現形式,而C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新,這與《設計模式》中的觀察者模式是完全一樣。

      MVC好處:從用戶的角度出發,用戶可以根據自己的需求,選擇自己合適的瀏覽數據的方式。比如說,對於一篇在線文檔,用戶可以選擇以HTML網頁的方式閱讀,也可以選擇以pdf的方式閱讀。從開發者的角度,MVC把應用程序的邏輯層與界面是完全分開的,最大的好處是:界面設計人員可以直接參與到界面開發,程序員就可以把精力放在邏輯層上。而不是像以前那樣,設計人員把所有的材料交給開發人員,由開發人員來實現界面。在Eclipes工具中開發 Android采用了更加簡單的方法,設計人員在DroidDraw中設計界面,以XML方式保存,在Eclipes中直接打開就可以看到設計人員設計的界面。

       Android中界面部分也采用了當前比較流行的MVC框架,在Android中:

1) 視圖層(View):一般采用XML文件進行界面的描述,使用的時候可以非常方便的引入。當然,如何你對 Android了解的比較的多了話,就一定可以想到在Android中也可以使用JavaScript+HTML等的方式作為View層,當然這里需要進行Java和JavaScript之間的通信,幸運的是,Android提供了它們之間非常方便的通信實現。    

2) 控制層(Controller):Android的控制層的重任通常落在了眾多的Acitvity的肩上,這句話也就暗含了不要在Acitivity中寫代碼,要通過Activity交割Model業務邏輯層處理,這樣做的另外一個原因是Android中的 Acitivity的響應時間是5s,如果耗時的操作放在這里,程序就很容易被回收掉。

3) 模型層(Model):對數據庫的操作、對網絡等的操作都應該在Model里面處理,當然對業務計算等操作也是必須放在的該層的。就是應用程序中二進制的數據。

      在Android SDK中的數據綁定,也都是采用了與MVC框架類似的方法來顯示數據。在控制層上將數據按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就可以直接在視圖模型上顯示了,從而實現了數據綁定。比如顯示Cursor中所有數據的ListActivity,其視圖層就是一個ListView,將數據封裝為ListAdapter,並傳遞給ListView,數據就在ListView中現實。

 

2.Android中的文件操作

   Android中的文件操作,類似於Java,因為它是基於JAVA的,所以JAVA中的文件操作思路同時適用於Android,文件操作采用一種流的概念,類似於水流和水池

輸出流是像水池中注水,輸入流是像外界輸水

      界面中的數據 -----輸出 ----->>>文件  (輸出流)

      文件中的數據 -----輸入 ----->>>界面  (輸入流)

下面是JAVA關於流的一些概念(來自http://blog.csdn.net/liuxiaogangqq/article/details/25892667):

  2.1 數據流

    一組有序,有起點和終點的字節的數據序列。包括輸入流和輸出流

  

2.2 輸入流(Input Stream)

    程序從輸入流讀取數據源。數據源包括外界(鍵盤、文件、網絡…),即是將數據源讀入到程序的通信通道

    

2.3 輸出流 (OutPut Stream)

   程序向輸出流寫入數據。將程序中的數據輸出到外界(顯示器、打印機、文件、網絡…)的通信通道

  

二、Android程序案例-文件讀寫操作的實現

  下面看一下效果演示:show

1.布局方面只有一個TextView,一個EditText,兩個Button                       ---View層

2.書寫Model層,即FileService                                                                 --Model層

package cn.edu.bzu.service;

import android.content.Context;

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

/**
 * MVC設計模式
 * M:model  V:view C:control
 * 文件操作的服務類,兼備文件讀寫的功能
 * Created by monster on 2015/5/29.
 */
public class FileService {
    private Context context;//上下文
    private String fileName; //文件的名字

    public FileService(Context context, String fileName) {//構造方法,用於傳入上下文
        this.context = context;
        this.fileName = fileName;
    }

    /**
     * 保存文件
     * 思路:創建文件輸出流-->>創建文件讀寫器-->>創建緩沖器-->>寫入操作
     */
    public boolean saveFile(String content){
        BufferedWriter bw=null; // 緩沖區聲明
        boolean isSaveSuccess=false;
        try {
            FileOutputStream fileOutputStream=context.openFileOutput(fileName,context.MODE_PRIVATE); //創建輸出流
            OutputStreamWriter outputStreamWriter=new OutputStreamWriter(fileOutputStream); //創建讀寫器
            bw=new BufferedWriter(outputStreamWriter); //創建一個使用默認大小輸出緩沖區的緩沖字符輸出流
            bw.write(content);
            isSaveSuccess=true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (bw != null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return isSaveSuccess;
    }

    /**
     * 讀取文件
     * 創建輸入流-->創建讀寫器-->>創建緩沖區-->>讀取數據
     */
    public String read(){
        BufferedReader br=null;
        String line;
        StringBuffer sb=new StringBuffer(); //用於添加數據
        try {
            FileInputStream fileInputStream=context.openFileInput(fileName);  //創建文件流
            InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream);//創建讀寫器
            br=new BufferedReader(inputStreamReader);
            while ((line=br.readLine())!=null){
            sb.append(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return sb.toString();
    }


}

此部分代碼為Model層,所以為了更好的使用,我們進行書寫一個測試類:

FileServiceTest.java:

package cn.edu.bzu.test;
import android.test.AndroidTestCase;

import cn.edu.bzu.service.FileService;
/**
 * 文件操作測試類,通過Android JUnit Test進行測試
 * @author monster
 * date:2015-05-30
 */
public class FileServieTest extends AndroidTestCase {
    public void testSave(){
        FileService fileService=new FileService(getContext(), "test.txt");
        fileService.saveFile("hello world");
    }
}
 

然后進行配置清單文件:

image

然后進行Android JUnit Test測試:

QQ截圖20150530110555

測試結果:成功

image

 

測試成功后書寫控制層(Control)代碼                                                                                 --Control層

MainActivity.java:

package cn.edu.bzu.fileoperate;

import cn.edu.bzu.service.FileService;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/**
 * 通過點擊按鈕實現存儲數據和讀取數據
 * @author monster
 * 使用MVC設計模式
 *  date:2015-05-30
 */
public class MainActivity extends Activity implements OnClickListener{
    private EditText edt_content;
    private Button btn_save,btn_read;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    private void initView() {
        edt_content=(EditText) findViewById(R.id.content);
        btn_save=(Button) findViewById(R.id.btn_save);
        btn_read=(Button) findViewById(R.id.btn_read);
        
        btn_save.setOnClickListener(this);
        btn_read.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.btn_save:
            String content=edt_content.getText().toString(); //得到值
            if(content!=null){
                FileService fs=new FileService(MainActivity.this, "Information.txt"); //通過構造方法傳入上下文和文件名
                boolean isSuccessed=fs.saveFile(content);
                if(isSuccessed){
                    Toast.makeText(MainActivity.this, "數據保存成功",Toast.LENGTH_SHORT).show();
                }
            }else{
                Toast.makeText(MainActivity.this, "請輸入您要保存的內容",Toast.LENGTH_SHORT).show();
            }
            break;
        case R.id.btn_read:
            FileService fs=new FileService(MainActivity.this, "Information.txt");
            String info=fs.read();  //讀取的數據
            if(info!=null){
                edt_content.setText(info); //給EditText設定值
                Toast.makeText(MainActivity.this, "讀取數據成功",Toast.LENGTH_SHORT).show();

            }else{
                Toast.makeText(MainActivity.this, "讀取數據發生錯誤",Toast.LENGTH_SHORT).show();
            }
            break;
        }
        
    }
}

  ----->>>  ok,大功告成

三、總結

從這個案例中,我們需要掌握:

1.Android MVC設計模式

2.Android文件操作的基本思路

3.JAVA異常處理機制

4.JUnit 進行單元測試

四、源代碼下載地址:

https://github.com/monsterLin/FileOperate.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM