一、要實現的功能
將輸入框中的數據保存到指定文件名的文件中,實現數據的持久化;如果數據已經保存了,活動下次再啓動的時候,就將保存在文件中的數據讀取出來,顯示在輸入框中。
二、基本知識
- 利用活動生命週期中的一個回調函數onDestroy(),在活動被銷燬之前,將數據寫入到文件當中。例如按下返回鍵的時候,活動就被銷燬,這個方法裏面的代碼就會被執行。
- 利用TextUtils中的isEmpty(CharSequence str)方法可以輕鬆地判斷一個字符串變量是不是null,以及這個字符串是不是空字符串(字符串長度爲0)。java中傳統的方式是這麼寫的:
if(string!=null&&string.length()!=0)
,這種方式比較麻煩,用TextUtils的話就比較方便了。 - ① 利用Contex類中的openFileOutput(String name, int mode)方法可以獲取一個FileOutputStream對象,這個方法第一個參數傳入的是文件名,第二個參數是文件的操作模式,取值主要有MODE_PRIVATE、 MODE_APPEND,如果文件已經存在了,第一種方式會把文件中原來的內容覆蓋掉,第二種方式則是在原來的基礎上進行追加數據。
②利用Contex類中的openFileInput(String name)可以獲取一個FileInputStream對象,方法中傳入的參數是文件的名稱。
除此之外,文件的讀寫操作就沒有什麼特殊的了,用到的都是JDK中的IO知識,這裏還用到了緩衝字符流,主要是爲了提高讀取、寫入的速度。
三、代碼
- java代碼:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity
{
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et=findViewById(R.id.et);
String load = load();
if (!TextUtils.isEmpty(load))//如果文件存在
{
et.setText(load);
et.setSelection(load.length());//將光標移動到輸入框的末尾
Toast.makeText(this,"從文件中恢復數據成功!",Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy()//活動被銷燬之前,將數據保存到文件中
{
super.onDestroy();
String string = et.getText().toString();
save(string);
}
/**
* 將文本數據寫入到文件中
* @param inputText
*/
private void save(String inputText)
{
FileOutputStream fileOutputStream=null;
BufferedWriter bufferedWriter=null;
try
{
fileOutputStream=openFileOutput("info.txt",MODE_PRIVATE);
bufferedWriter=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
bufferedWriter.write(inputText);
} catch (Exception e)
{
System.out.println(e);
}
finally
{
if (bufferedWriter!=null)
{
try
{
bufferedWriter.close();
} catch (IOException e)
{
System.out.println(e);
}
}
}
}
/**
* 從文件中讀取數據
* @return
*/
private String load()
{
FileInputStream fileInputStream=null;
BufferedReader bufferedReader=null;
StringBuilder stringBuilder=new StringBuilder();
try
{
fileInputStream= openFileInput("info.txt");
bufferedReader=new BufferedReader(new InputStreamReader(fileInputStream));
String line="";
while ((line=bufferedReader.readLine())!=null)
{
stringBuilder.append(line);
}
} catch (Exception e)
{
System.out.println(e);
}
finally
{
if (bufferedReader!=null)
{
try
{
bufferedReader.close();
} catch (IOException e)
{
System.out.println(e);
}
}
}
return stringBuilder.toString();
}
}
- 佈局代碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="請輸入您要保存的信息"/>
四、截圖
以下是兩張在模擬器中的效果截圖。
- 輸入要保存的文字信息:
- 文件保存以後,下次再打開程序: