Android学习之文件存储

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

.AndroidMVC模式如下

步骤1: 布局编辑:

布局页面及代码如下:

<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流,即输入输出流,小编搜索相应资料如下:

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

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

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

单元测试步骤如下:

①在AndroidManifest.xml文件中配置单元测试需要的环境

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

②通过继承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");//存储为xml文件?
        testSave.save("hello test");
    }

    /**测试FileService中的Read方法*/
    public void testRead() {
        FileService testRead = new FileService(getContext(), "data");//存储为xml文件?
        testRead.read();
    }
}

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

③运行测试:

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

测试结果:

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

步骤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(xml布局) C控制层(Activity)
 * 测试业务层,必须要进行单元测试,确定业务层方法没问题的情况下,编写控制层*/
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;

        }
    }

}

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

时间: 2024-08-04 22:27:50

Android学习之文件存储的相关文章

Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习

一.URI 通用资源标志符(Universal Resource Identifier, 简称"URI"). Uri代表要操作的数据,Android上可用的每种资源 - 图像.视频片段等都可以用Uri来表示. URI一般由三部分组成: 访问资源的命名机制. 存放资源的主机名. 资源自身的名称,由路径表示. Android的Uri由以下三部分组成: "content://".数据的路径.标示ID(可选) 举些例子,如: 所有联系人的Uri: content://con

Android中的文件存储

另见Android中的文件存储 一.前言 文件存储时Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因此它比较适合用于存储一些简单的文本数据或二进制数据. 二.将数据存储到文件中 Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中. 可以看到,此方法接收两个参数,第一个即是文件的名字,这里不可以包含文件路径,所有的文件都是默认存储到/data/data//files/目录下的.

Android入门(九)文件存储与SharedPreferences存储

原文链接:http://www.orlion.ga/578/ Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储.SharedPreference存储以及数据库存储.当然,除了这三种方式之外,你还可以将数据保存在手机的 SD卡中,不过使用文件.SharedPreference或数据库来保存数据会相 对更简单一些,而且比起将数据保存在 SD卡中会更加的安全 一.文件存储 1.将数据存储到文件中 Context类中提供了一个 openFileOutput ()方法,可以用

Android中的文件存储数据方式

转自以下文章: http://blog.csdn.net/zuolongsnail/article/details/6559338 http://blog.csdn.net/xiazdong/article/details/7687439 http://www.cnblogs.com/feisky/archive/2011/01/05/1926177.html 1.文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方

Android学习总结——文件储存

Android中文件存储的操作: 1.Activity的openFileOutput()方法可以把数据输出到文件中2.创建的文件保存在/data/data/<package name>/files目录3.实现过程与在java中保存数据到文件中是一样的 <!-- 在SD卡中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

Android学习笔记 --- 数据存储与访问 (File,sdcard,sharedpreferences,sqlite)

一.使用文件进行数据存储 1.context.openFileOutput()方法  写入文件内容 在上下文context中 openFileOutput方法可以用于把数据输出到文件中 示例代码: public static void fileStorage(Context context){ try { FileOutputStream fos = context.openFileOutput("filedata.txt", context.MODE_PRIVATE); fos.wr

Android中的文件存储技术

文件存储是每个系统都应该具有的功能,Android系统采用Java语言开发,所以它的文件存储功能基本上和J2SE一样的.为什么会引入文件存储?因为大文件.图片等我们若只存储在手机中很有限,一般都是用一个外存储设备进行存储.好了今天我们就讲讲用编程的方式在Android系统中进行存储. 文件存储的位置 一般文件默认存储在/data/data/<包>/files/***.***(针对我们开发的APK的时候),当然我们也可以存储在存储卡上(这个时候需要在androidManifest.xml 设定文

kafka学习之-文件存储机制

Kafka是什么 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志.访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目. 1.前言 一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一.下面将从Kafka文件存储机制和物理结构角度,分析Kafka是如何实现高效文件存储,及实

android学习之文件

一.输入输出流       首先,你要明白什么是"流".直观地讲,流就像水一样,不存在大小问题,也避免了完整性问题.非流的数据传输,比如你下载一张图片,需要整幅图片下载完之后才能使用,而流则不同,就像水,你取一杯也可以用,取一桶也可以用.所以说,流是一种数据传输的模式.      而输入流和输出流,差别在于出和入,是相对于程序而言的."输入流式得到数据,输出流是输出数据",这种说法是对的.你把问题想复杂了,输入是程序得到外部数据,输出是程序向外部传输数据,二者没有必