1 设计界面
<?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">
?<!-- 相对布局开始 -->
?<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
??android:orientation="vertical" android:layout_width="fill_parent"
??android:layout_height="wrap_content">
??<!-- wrap_content 包裹 内容-->
??<!-- fill_parent 填充父项 一行 -->
??<!-- TextView 文本标题 -->
??<!-- @+id/filenameTesxwiew 设置id -->
??<TextView android:layout_width="wrap_content"
???android:layout_height="wrap_content" android:text="@string/hello"
???android:id="@+id/filenameTesxwiew" />
???<!-- EditText 文本内容项 -->
??<EditText android:layout_width="60px"
???android:layout_toRightOf="@id/filenameTesxwiew"
???android:layout_marginLeft="10px"
???android:layout_alignTop="@id/filenameTesxwiew" android:layout_height="wrap_content"
???android:id="@+id/fileName" />
?</RelativeLayout>
?<!-- 相对布局结束 -->
?<TextView
?android:layout_width="fill_parent"
?android:layout_height="wrap_content"
?android:text="@string/contentlable" />
?<EditText
?android:layout_width="fill_parent"
?android:layout_height="wrap_content"
?android:minLines="5"
?android:id="@+id/fileContent" />
?<Button
?android:layout_width="wrap_content"
?android:layout_height="wrap_content"
?android:text="@string/buttontext"
?android:id="@+id/button"
?/>
</LinearLayout>
<!-- 线性布局结束 -->
?
2 设计业务类
package cn.lee.Manager;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class DataManager {
?/**?
???? * 没有使用成员变量的方法可以定义为静态方法?
???? * 保存数据的业务逻辑?
???? * OutputStream 输出流?
??? * content 文件内容?
??????? * @throws Exception??
?? */?
?public static void saveDate (OutputStream outputStream , String contentString) throws Exception
?{
??outputStream.write(contentString.getBytes());
??outputStream.close();
?}
? /**?
???? * 读取数据的业务逻辑?
????? * @param InputStream?
????? * @param contentString?
??? * @throws Exception?
??? */?
?public static? String readDate (InputStream inputStream ) throws Exception
?{
??byte [] byte1 = new byte[1024];
?? /**?
??????? * 当输入流读到文件的末尾 返回就是-1??
????? */?
??int length = inputStream.read(byte1);
??ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
??if(length!=-1)
??{
??? //读到的内容存在内存中ByteArrayOutputStream 这个类用于将byte流存储在内存中??
???
???byteArrayOutputStream.write(byte1, 0, length);
??}
??String dateString =?? byteArrayOutputStream.toString();
??byteArrayOutputStream.close();
??inputStream.close();
??return dateString;
?}
}
3 配置资源文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
????? package="cn.lee.data"
????? android:versionCode="1"
????? android:versionName="1.0">
??? <application android:icon="@drawable/icon" android:label="@string/app_name">
??????? <!-- 第一步 加入单元测试使用的库 -->
??? ?<uses-library? android:name="android.test.runner" />
??? ?
??????? <activity android:name=".AboutDateActivity"
????????????????? android:label="@string/app_name">
??????????? <intent-filter>
??????????????? <action android:name="android.intent.action.MAIN" />
??????????????? <category android:name="android.intent.category.LAUNCHER" />
??????????? </intent-filter>
??????? </activity>
??? </application>
??? <uses-sdk android:minSdkVersion="7" />
??? <!-- 加入单元测试的启动器? -->
??? <!-- 注意点? android:targetPackage=""是指定单元测试所在的包? 这个包必须和所属应用的包一致 否则会找不到测试类 -->
?<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.lee.data"
?android:label="Test for my app"/>
?
</manifest>
?
4 单元测试
package cn.lee.data;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import cn.lee.Manager.DataManager;
import android.content.Context;
import android.test.AndroidTestCase;
import android.util.Log;
public class DateManagerTest extends AndroidTestCase {
?
?private static final String TAG="DateManagerTest";
?public void testSave ()throws Exception {
? /**?
? * 内容先定义成固定的内容?
? *? Activity的父类的父类就是context,context与其他框架中的context相同为我们以供了一些核心操作工具。?
? *? openFileOutput("fileName", Context.MODE_PRIVATE);?
? *? 参数1:文件的名字 不能包含路径分隔符‘/’??
? *? 使用这个方法创建的文件,会保存在手机/date/date/应用文件夹(这里就是cn.lee.data)/files目录下;?
? *? /date/date/cn.lee.data/files/fileName.txt 我们可以在window-show view -other-android-file explore看到?
? *? 这是有android决定的;?
? *? 参数2:保存的模式:???
? *? 使用context中的文件输出流它有四种模式:?
? *? 文件读写的操作模式:?
? *????? Context.MODE_PRIVATE=0:只能是当前的应用才能操作文件 如果创建的文件已经存在 新内容覆盖原内容?
? *????? Context.MODE_APPEND=32768:新内容追加到原内容后 这个模式也是私有的 这个文件只能被创建文件的应用所访问?
???? *????? Context.MODE_WORLD_READABLE=1:允许其他应用程序读取本应用创建的文件?
? *????? Context.MODE_WORLD_WRITEABLE=2:允许其他应用程序写入本应用程序创建的文件,会覆盖原数据。??????????????
? */?
??????? //文件输出流? 参数一? 输出目标 参数二 输出模式
??????? FileOutputStream fileOutputStream = this.getContext().openFileOutput("fileName.txt", Context.MODE_PRIVATE);
??DataManager.saveDate(fileOutputStream, "xxxxxxx");
?}
?public void? testRead() throws Exception{
??//文件输入流 参数是数据源
??FileInputStream fileInputStream = this.getContext().openFileInput("fileName.txt");
??String contentString = DataManager.readDate(fileInputStream);
??Log.i(TAG, contentString);
?}
}
5? string.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
??? <string name="hello">文件名称</string>
??? <string name="app_name">数据的保存和读取</string>
<string name="contentlable">文件内容</string>
<string name="buttontext">保存</string>
<string name="infor">保存失败</string>
<string name="sus">保存成功</string>
</resources>
?
6 动作执行的类
package cn.lee.data;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import cn.lee.Manager.DataManager;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class AboutDateActivity extends Activity {
?private EditText fileNameEditText;
?private EditText fileContentEditText;
?private Button button;
?private static final String TAGSTRING ="AboutDateActivity";
?/** Called when the activity is first created. */
[email protected]
?public void onCreate(Bundle savedInstanceState) {
??super.onCreate(savedInstanceState);
??setContentView(R.layout.main);
??//获取文本内容 保存的文件名
??fileNameEditText = (EditText) this.findViewById(R.id.fileName);
??//文件内容
??fileContentEditText = (EditText) this.findViewById(R.id.fileContent);
??
??button = (Button) this.findViewById(R.id.button);
??button.setOnClickListener(new OnClickListener() {
??
???public void onClick(View v) {
????int info = R.string.sus;//获取布局文件sus的id 保存成功
????String fileNameString = fileNameEditText.getText().toString();
????String fileContentString = fileContentEditText.getText()
??????.toString();
????// TODO Auto-generated method stub
????//定义文件输出流
????FileOutputStream fileOutputStream = null;
????try {
?????fileOutputStream = AboutDateActivity.this
???????.openFileOutput(fileNameString, Context.MODE_PRIVATE);
?????//执行
?????DataManager.saveDate(fileOutputStream, fileContentString);
?????
????} catch (Exception e) {
?????// TODO Auto-generated catch block
?????Log.i(TAGSTRING, e.toString());
?????info = R.string.infor;
????}finally{
?????try {
??????fileOutputStream.close();
?????} catch (IOException e) {
??????// TODO Auto-generated catch block
??????Log.i(TAGSTRING, e.toString()); //输出日志信息
??????info = R.string.infor; //保存失败
?????}
????}
????//Toast.makeText 提示信息?
????Toast.makeText(AboutDateActivity.this, info, 1).show();
???}
??});
?}
}