实现内部存储
设计思路
首先获取控件的id,然后设置“写入数据”和“读出数据”两个按钮的监听事件。
在“写入数据”按钮中,先判断追加模式是否被勾选。如果没有被勾选,设置为私有模式,文件仅能够被创建文件的程序访问。如果追加模式被勾选,设置为追加模式,如果文件已经存在,则在文件的结尾处添加新数据。再获取editText1的值,调用write()函数将数据写入文件,把editText1的内容清空。最后调用flush()函数将缓冲数据写入文件,调用close()函数关闭FileOutputStream。
在“读出数据”按钮中,首先打开对应的文件,判断返回的实际可读字数是否为0。若不为0,则以二进制方式读取数据,再将读取的数据显示在editText2中。
运行结果
写入数据(没有勾选追加模式):
点击读出数据(没有勾选追加模式):
写入数据(勾选追加模式):
点击读出数据(勾选追加模式):
代码
TwoTestActivity .java(也可写在MainActivity.java中)
package com.example.test6;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TwoTestActivity extends AppCompatActivity {
private EditText editText1,editText2;
private Button button1,button2;
private CheckBox checkBox;
String FILE_NAME="fileDemo.txt"; //定义文件名称为fileDemo.txt
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two_test);
getId();
//写入数据
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FileOutputStream fileOutputStream=null;
try{
//如果追加模式被勾选
if (checkBox.isChecked()){
//MODE_APPEND:追加模式,如果文件已经存在,则在文件的结尾处添加新数据
fileOutputStream=openFileOutput(FILE_NAME, Context.MODE_APPEND);
}
//追加模式没有被勾选
else {
//MODE_PRIVATE:私有模式,文件仅能够被创建文件的程序访问
fileOutputStream=openFileOutput(FILE_NAME,Context.MODE_PRIVATE);
}
String text=editText1.getText().toString(); //获取editText1的值
fileOutputStream.write(text.getBytes()); //调用write()函数将数据写入文件
editText1.setText(""); //把editText1的内容清空
}catch (FileNotFoundException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
finally {
if(fileOutputStream!=null){
try {
fileOutputStream.flush(); //调用flush()函数将缓冲数据写入文件
fileOutputStream.close(); //调用close()函数关闭FileOutputStream
}catch (IOException e){
e.printStackTrace();
}
}
}
}
});
//读出数据
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText2.setText("");
FileInputStream fileInputStream=null;
try {
//打开文件
fileInputStream=openFileInput(FILE_NAME);
//available:返回实际可读字数,总大小
if(fileInputStream.available()==0){
return;
}
//以二进制方式读取数据
byte[] readBytes=new byte[fileInputStream.available()];
//如果因为流位于文件末尾而没有可用的字节,则返回-1
while (fileInputStream.read(readBytes)!=-1){
}
//将读取的数据显示在editText2中
String text=new String(readBytes);
editText2.setText(text);
}catch (FileNotFoundException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}
});
}
/**
* 获取控件id
*/
private void getId(){
editText1=(EditText)findViewById(R.id.editText);
editText2=(EditText)findViewById(R.id.editText4);
button1=(Button)findViewById(R.id.button8);
button2=(Button)findViewById(R.id.button10);
checkBox=(CheckBox)findViewById(R.id.checkBox);
}
}
activity_two_test.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".TwoTestActivity">
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="写入数据"
app:layout_constraintStart_toStartOf="@+id/editText"
app:layout_constraintTop_toBottomOf="@+id/editText" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="113dp"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="@+id/editText4"
app:layout_constraintStart_toStartOf="@+id/editText4"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editText4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="56dp"
android:layout_marginLeft="56dp"
android:layout_marginTop="40dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Test2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button8" />
<Button
android:id="@+id/button10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="54dp"
android:text="读出数据"
app:layout_constraintEnd_toEndOf="@+id/button8"
app:layout_constraintStart_toStartOf="@+id/editText4"
app:layout_constraintTop_toBottomOf="@+id/editText4" />
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:text="追加模式"
app:layout_constraintStart_toStartOf="@+id/button10"
app:layout_constraintTop_toBottomOf="@+id/button10" />
</androidx.constraintlayout.widget.ConstraintLayout>