你的位置:首页 > 操作系统

[操作系统]Android学习之文件存储


今天做了下文件存储的小案例,并借此巩固一下Android中的单元测试及MVC的设计模式.

.AndroidMVC模式如下

image

步骤1: 布局编辑:

布局页面及代码如下:

image

<Button    android:id="@+id/btnSave"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_below="@+id/etContent"    android:layout_centerHorizontal="true"    android:layout_marginTop="39dp"    android:text="@string/btn_tip_save" />  <EditText    android:id="@+id/etContent"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignParentTop="true"    android:layout_centerHorizontal="true"    android:layout_marginTop="74dp"    android:drawableLeft="@drawable/icon"    android:ems="15"    android:hint="@string/et_tip_writeContent"    android:minLines="3" >        <!-- ems长度 -->    <requestFocus />  </EditText>

其中:android:ems="15" 代表设置TextView或EditText的宽度为15个字符的宽度

 

步骤2:业务层编辑:

代码如下:

package com.example.savafile.service;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;import android.content.Context;/**用于对页面的操作,此处为数据的保存与读取*/public class FileService {  private Context context;  private String fileName;  /**初始化上下文和文件名(路径)*/  public FileService(Context context, String fileName) {    this.context = context;    this.fileName = fileName;  }  public boolean save(String content) {    boolean isSaveSuccessed = false;    BufferedWriter bw=null;    try {      //为Context建立输出流(数据流向程序外)      //参数1为存储的文件名, 参数2 为MODE模式      FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);//构建字节输出流      OutputStreamWriter writer = new OutputStreamWriter(fos);//将字节输出流包装为字符输出流      bw = new BufferedWriter(writer);//将字符输出流包装为缓存流?      bw.write(content);//write与OutputStream的区别      isSaveSuccessed = true;    } catch (FileNotFoundException e) {      e.printStackTrace();    } catch (IOException e) {      e.printStackTrace();    }finally{      try {        //write和fos为什么不用关闭呢?        if (bw != null) {          bw.close();        }      } catch (IOException e) {        e.printStackTrace();      }    }    return isSaveSuccessed;  }  public String read(){    String line;    StringBuilder sb = new StringBuilder();//作用是什么    BufferedReader br = null;        try {      FileInputStream fis = context.openFileInput(fileName);//通过Context中的openFileInput(路径)的方法获取输入流      br = new BufferedReader(new InputStreamReader(fis));      while((line = br.readLine()) != null){        sb.append(line);//s +=line;作用一致,但会造成大量的内存浪费      }    } catch (IOException e) {//br.readLine()异常块      e.printStackTrace();    }        return sb.toString();  }}

 

此处用到了JAVA中的I/O流,即输入输出流,小编搜索相应资料如下:

image

想要具体了解的可以通过书籍,网络等资料进行学习.

--------------------------------------------------------------------------------------

需要注意的是,对业务层进行编辑之后需要对业务层中的方法进行单元测试,以确保其正确性.确保业务层内的方法正确后,再进行对控制层(Activity)的编辑,此时,若再出错,则可确定错误不在业务层,去控制层或模型层进行排错即可.

 

单元测试步骤如下:

①在AndroidManifest.

image

图中,红线内的内容即为所需

②通过继承Android提供的AndroidTestCase父类来编写相应的测试方法

代码如下:

package com.example.savafile.serviceTest;import com.example.savafile.service.FileService;import android.test.AndroidTestCase;/**单元测试*/public class ServiceTest extends AndroidTestCase {  /**测试FileService中的save方法*/  public void testSave() {    FileService testSave = new FileService(getContext(), "data");//存储为    testSave.save("hello test");  }    /**测试FileService中的Read方法*/  public void testRead() {    FileService testRead = new FileService(getContext(), "data");//存储为    testRead.read();  }}

单元测试的方法名最好以    test+需要测试的方法名    命名

③运行测试:

在打开虚拟机(或真机)的情况下,在单元测试类中右击大纲的方法,运行为android项目即可

image

image

测试结果:

image

成功时,红色标记部分会显示绿色进度条,反之,则为红色进度条,且在黄色标记区域显示测试方法的错误信息,非常好用哦

 

步骤3: 控制层编辑:

代码如下:

package com.example.savafile;import com.example.savafile.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;/**Android开发遵循的MVC原则 M业务层(FileService) V(*/public class MainActivity extends Activity implements OnClickListener {  private Button btnSvae;  private EditText etContent;    @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);        initialize();    readText();      }    /**初始化控件,并设置相应的监听器*/  private void initialize() {    btnSvae = (Button) findViewById(R.id.btnSave);    etContent = (EditText) findViewById(R.id.etContent);        btnSvae.setOnClickListener(this);  }    /**读取之前存储的数据*/  private void readText(){    String data = fileService.read();    if(data!=null){      etContent.setText(data);    }  }    FileService fileService = new FileService(MainActivity.this, "data.txt");     /**监听器方法*/  @Override  public void onClick(View v) {    switch (v.getId()) {    case R.id.btnSave:      if(fileService.save(etContent.getText().toString())){//是否保存成功        Toast.makeText(MainActivity.this, "恭喜您,保存成功!", Toast.LENGTH_SHORT).show();      }else{        Toast.makeText(MainActivity.this, "好可惜,保存失败!", Toast.LENGTH_SHORT).show();      }      break;    }  }}

到此,就算编辑结束了.谢谢