Android开发系列(五):Android应用中文件的保存与读取

在本篇博客中,我们要实现在Android中“新建文件”和“读取文件”:

目标界面:

在输入文件名称之后,输入文件内容,点击保存,可以保存成为一个文档

首先,我们先建立一个Android Project项目,项目名称:File。

然后,我们需要先实现目标视图中的界面:

编辑strings.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="hello">Hello World, FileActivity!</string>
    <string name="app_name">文件操作</string>
    <string name="filename">文件名称</string>
	<string name="filecontent">文件内容</string>
	<string name="button">保存</string>
	<string name="success">保存完成</string>
	<string name="fail">保存失败</string>
</resources>

编辑: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="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/filename" />
      <EditText
      		 android:layout_width="fill_parent"
       		 android:layout_height="wrap_content"
       		 android:id="@+id/filename"
       />
       <TextView
       		 android:layout_width="fill_parent"
       		 android:layout_height="wrap_content"
       		 android:text="@string/filecontent"
       />
       <EditText
       		android:layout_width="fill_parent"
       		android:layout_height="wrap_content"
       		android:id="@+id/filecontent"
       />
       <Button
       		android:layout_width="wrap_content"
       		android:layout_height="wrap_content"
       		android:text="@string/button"
       		android:id="@+id/button"
       />
</LinearLayout>

由此,我们就把界面构造完成了,接下来就是编写java代码(关于界面编写过程不再详细说明)。

然后,我们要编辑FileActivity.java(代码具体解释在程序中):

package cn.itcast.files;

import cn.itcast.fservice.FileService;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class FileActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); //实现布局页面的跳转
        Button button = (Button)this.findViewById(R.id.button); //获取Button属性
        button.setOnClickListener(new ButtonClickListener()); //为Button设置监听器
    }
    /**
     * Button点击事件监听器实现
     * @author hc
     *
     */
    private final class ButtonClickListener implements View.OnClickListener{

		@Override
		public void onClick(View v) { //生成默认的方法
			EditText filenameText = (EditText)findViewById(R.id.filename); //获得“文件名称”输入框对象
			EditText contentText = (EditText)findViewById(R.id.filecontent); //获得“文件内容”输入框对象
			String filename = filenameText.getText().toString(); //获得输入的“文件名称”
			String content = contentText.getText().toString(); //获得输入的“文件内容”

			//new一个FileService对象,getApplicationContext()返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁
			FileService service = new FileService(getApplicationContext());
			try {
				service.save(filename,content); //调用save()方法保存文件
				Toast.makeText(getApplicationContext(), R.string.success, 1).show(); //调用一个Toast呈现一个“保存完成”的消息
			} catch (Exception e) {
				Toast.makeText(getApplicationContext(), R.string.fail, 1).show(); //调用Toast对象呈现一个“保存失败”的消息
				e.printStackTrace();
			}

		}

    }

}

在FileActivity.java中我们用到了一个类FileService.java,他提供了写入文件write()和读取文件read()方法。

因此,我们需要建立一个FileService.java类:

package cn.itcast.fservice;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;

public class FileService {
	private Context context;

	public FileService(Context context) {
			super();
			this.context = context;
		}
	/**
	 * 写入文件和关闭文件
	 * @param content 写入内容
	 * @param outStream 输出流
	 * @throws IOException
	 */
	private void write(String content, FileOutputStream outStream)
	throws IOException {
			outStream.write(content.getBytes());
			outStream.close();
	}

	/**
	 * 保存文件
	 * @param filename 文件名称
	 * @param content 文件内容
	 * @throws Exception
	 */
	public void save(String filename, String content) throws Exception {
		//私有操作模式:创建出来的文件只能被本应用访问,其他应用无法访问该文件。
		//另外采用私有操作模式创建的文件,写入文件中的内容会覆盖源文件内容
		FileOutputStream outStream = context.openFileOutput(filename,Context.MODE_PRIVATE); //采用私有操作模式打开输出流
		write(content, outStream);
	}

	/**
	 * 读取文件内容
	 * @param filename 文件名称
	 * @return 文件内容
	 * @throws Exception
	 */
	public String read(String filename)throws Exception{
		FileInputStream inStream = context.openFileInput(filename);
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		//读完返回-1,未读完返回读了多少数据
		while((len = inStream.read(buffer)) != -1){
			outStream.write(buffer, 0 , len);
		}
		byte[] data = outStream.toByteArray();
		return new String(data);

	}

}

到了这里,我们就已经把功能实现了,接下来我们把工程部署到Android模拟器中,

测试一下:

可以看到,我们文件已经是保存完成了,在这里我们需要找到这个文件被保存在了哪里。

首先,我们需要打开File Explorer视图:

我们可以在data—>data—>cn.itcast.files(这个是工程所在的包)—>files这个目录下边,找到Test.txt文件,然后我们把它导出到桌面

可以看到里边的内容就是我们输入的内容。

说到这里,文件的保存已经介绍完毕了,接下来我们要介绍一下文件的读取:

我们需要建立一个测试文件,建立测试文件需要首先配置AndroidManifest.xml(关于这个文件的配置请见Android开发系列(四),这就就不再继续配置了)

我们建立一个测试类:FileServiceTest.java(继承AndroidTestCase类):

package cn.itcast.test;

import cn.itcast.fservice.FileService;
import android.test.AndroidTestCase;
import android.util.Log;

public class FileServiceTest extends AndroidTestCase {
	private static final String TAG = "FileServiceTest"; //设置一个TAG
		public void testRead() throws Throwable{
			FileService service = new FileService(this.getContext());
			String result = service.read("Test.txt"); //读取文件Test.txt
			Log.i(TAG, result); //把得到的文件的内容result交给TAG。然后我们就可以在LogCat界面中查看得到了
		}
}

可以查看如下:

时间: 2024-11-07 03:27:45

Android开发系列(五):Android应用中文件的保存与读取的相关文章

C#程序员学习Android开发系列之Android项目的目录结构

今天开始正式学习Android开发的种种细节,首先从最基本的概念和操作学起. 首先看一下Android项目的目录结构. 这是我随便建立的一个test项目,我们重点关注一下几个方面的内容: 1.src目录:存放java源代码的目录,里面建立一个包,包里面有4个java源文件(分别都继承自Activity).由于java要求比较严格,因此要求类名与文件名一致. gen(Generated Java Files)目录:自动产生Java源文件的目录,是由工具自动生成的,一般不需要自己修改.里面主要有一个

Android开发系列之Android项目的目录结构

今天开始正式学习Android开发的种种细节,首先从最基本的概念和操作学起. 首先看一下Android项目的目录结构. 这是我随便建立的一个test项目,我们重点关注一下几个方面的内容: 1.src目录:存放Java源代码的目录,里面建立一个包,包里面有4个java源文件(分别都继承自Activity).由于java要求比较严格,因此要求类名与文件名一致. 2.gen(Generated Java Files)目录:自动产生Java源文件的目录,是由工具自动生成的,一般不需要自己修改.里面主要有

Android开发系列(十一):对手机通讯录的读取、添加、删除、查找

一.通讯录介绍 通讯录是Android手机自带的一个应用,它是一个ContentProvider应用,其它应用可以对通讯录进行访问,进行对联系人的CRUD操作. 二.通讯录数据库结构的介绍 首先,我们可以在File Explorer视图下找到contacts2.db文件,这是通讯录的文件 然后,我们用SQLite打开,分析下它的数据库结构: raw_contacts表: data表: mimetypes表: 这三张表的结构介绍完了,接下来我们说下它们之间的联系: raw_contacts表存放联

C#程序员学习Android开发系列之ListView

上篇博客解决了Android客户端通过WebService与服务器端程序进行交互的问题,这篇博客重点关注两个问题,一个是Android应用程序如何与本机文件型数据库SQLite进行交互,另一问题则是如何在ListView中按照我们想要的界面效果进行展示.限于篇幅这篇重点讲ListView,下篇博客重点阐述SQLite. ListView是一个常用的数据显示控件,假设我们要做一个简单的界面,如图所示. 这张图是我直接从Android平板电脑(Android 4.2.2)上面截图下来的,就是一个普通

C#程序员学习Android开发系列之学习路线图

通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明确一下接下来的学习目标以及学习路线. 一.对Android开发的基本认识 1.Android原生开发是基于Java语言的,由于我比较擅长C#,所以对Java语言本身不太熟练,需要加强Java语言基础的练习,这一块我会穿插到具体的知识点练习当中,并且在必要的地方给出与C#语言的对比(其实基本上在语法层

快速Android开发系列网络篇之Android-Async-Http

快速Android开发系列网络篇之Android-Async-Http 转:http://www.cnblogs.com/angeldevil/p/3729808.html 先来看一下最基本的用法 AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onSucce

快速Android开发系列网络篇之Retrofit

Retrofit是一个不错的网络请求库,用官方自己的介绍就是: A type-safe REST client for Android and Java 看官网的介绍用起来很省事,不过如果不了解它是怎么实现的也不太敢用,不然出问题了就不知道怎么办了.这几天比较闲就下下来看了一下,了解一下大概实现方法,细节就不追究了.先来看一个官网的例子,详细说明去网官看 简单示例 首先定义请求接口,即程序中都需要什么请求操作 public interface GitHubService { @GET("/use

C#程序员学习Android开发系列之SQLite

上篇博客提到过SQLite,它是嵌入式数据库,由于其轻巧但功能强大,被广泛的用于嵌入式设备当中.后来在智能手机.平板流行之后,它作为文件型数据库,几乎成为了智能设备单机数据库的必选,可以随着安卓app打包到apk文件当中. SQLite的官方网站是http://www.sqlite.org/,可以任意下载,上面也有详尽的文档可以参考,这篇博客重点关注SQLite在Android开发中如何使用. 在Android开发中,推荐建立一个类继承自SQLiteOpenHelper来创建数据库操作类,比如:

快速Android开发系列网络篇之Volley

Volley是Google推出的一个网络请求库,已经被放到了Android源码中,地址在这里,先看使用方法 RequestQueue mRequestQueue = Volley.newRequestQueue(context); JsonObjectRequest req = new JsonObjectRequest(URL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONO