首页 > 代码库 > Android开发系列(五):Android应用中文件的保存与读取

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 = http://www.mamicode.com/outStream.toByteArray();>
到了这里,我们就已经把功能实现了,接下来我们把工程部署到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界面中查看得到了
		}	
}
可以查看如下:




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