一、预备知识

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程序案例-文件读写操作的实现

下面看一下效果演示:

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");
}
}
 

然后进行配置清单文件:

然后进行Android JUnit Test测试:

测试结果:成功

测试成功后书写控制层(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

Android数据存储-文件操作的更多相关文章

  1. android 数据存储----文件方式 总结

    在android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中对资源文件的读取.数据区文件的读取.SD卡文件的读取及RandomAccessFile的方式和方法进行了整理. ...

  2. Android 数据存储-文件读写操作

    本来已经写了一部分,后来发现这篇博客写的比我的好,就直接引用一下: https://www.cnblogs.com/LiHuiGe8/p/5604725.html

  3. Android数据存储-通过SharedPreferences实现记住密码的操作

    在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...

  4. Android数据存储之GreenDao 3.0 详解

    前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...

  5. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  6. 10、Android数据存储

    课程目标: 掌握Android中数据存储的几种方式 熟练使用PreferenceActivity&PreferenceScreen做专业的Setting功能 熟练使用SQLite3来存储数据 ...

  7. Android数据存储:SDCard

    Android数据存储之SDCard 0.获取sd卡路径. 1.讲述 Environment 类. 2.讲述 StatFs 类. 3.完整例子读取 SDCard 内存 0.获取sd卡路径 方法一: p ...

  8. Android数据存储:File

    Android数据存储之File Files:它通过FileInputStream和FileOuputStream对文件进行操作.但是在Android中,文件是一个应用程序私有的,一个应用程序无法读写 ...

  9. Android数据存储:Shared Preferences

    Android数据存储之SharedPreferences 在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上, Android 为数据存储提供了如下几种方式:1 ...

随机推荐

  1. Xcode里-ObjC, -all_load, -force_load

    最近在做一个项目的时候,需要使用到一个第三方库,这个库的使用向导里面特别说明,在添加完该库后,需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志 ...

  2. eap

    本文介绍了eap  

  3. Linux shell运算符

    双引号 --使用双引号可以引用除了字符$,`(单反号),\(反斜杠)外的任意字符或者字符串 --echo "参数的个数是$#" 单引号 --单引号与双引号类似,不同的是shell会 ...

  4. tkinter 的两个例子

    第一个例子:after 用于定时操作 import tkinter as tk import time class MyApp(tk.Frame): def __init__(self, msecs= ...

  5. Logging的这点小事

    真正做项目,才发觉Logging的好处和学问.自己胡搞的时候,常常使用System.out.println作为输出. 但实际的项目,尤其是library比较多的时候,好好配置好Logging,才能在后 ...

  6. TinyFrame升级之十:WCF Rest Service注入IOC的心

    由于在实际开发中,Silverlight需要调用WebService完成数据的获取,由于之前我们一直采用古老的ASMX方式,生成的代理类不仅难以维护,而且自身没有提供APM模式的调用方式,导致在Sin ...

  7. 一道int与二进制加减题

    int dis_data = 32769; if( dis_data > 0x7fff)  dis_data -= 0xffff; printf("%d\n",dis_dat ...

  8. web安全——代理(nginx)

    场景 过滤非正常用户使用的http请求. 限制正常用户使用的范围(下载速度.访问频率等). 通过架构规划来提升安全. 能自动解决http请求问题. 解决方案 代理自身的安全 千万不要使用root启动! ...

  9. 通过Keepalived实现Redis Failover自动故障切换功能

    通过Keepalived实现Redis Failover自动故障切换功能[实践分享] 参考资料: http://patrick-tang.blogspot.com/2012/06/redis-keep ...

  10. 【原创】你知道OneNote的OCR功能吗?office lens为其增大威力,中文也识别

    OneNote提供了强大的从图片中取出文字的功能,大家只要装上了桌面版OneNote(本人用的2013版和win8.1版测试的,其他版本为测),将图片放在OneNote笔记中,右键图片即可把图片中的文 ...