安卓数据持久化之文件存储

数据持久化:将用户产生的瞬时数据保存到存储设备中,保证在手机或电脑关机的情况下,这些数据仍然不会丢失。

文件存储为安卓数据持久化技术之一,特点是不对存储的内容进行任何的格式化处理。

前置知识:需要掌握java的流处理技术。点击查看廖雪峰的Java教程中对应部分的内容

  1. 将数据存储到指定文件中:Context类中提供了openFileOutput方法,可以将数据存储到指定的文件中

    1. 参数1:文件名:文件创建的时候用的名称(不包含路径,默认存储到/data/data/<package name>/files/目录下
    2. 参数2:文件的操作模式
      1. MODE_PRIVATE:默认的操作模式,如果该文件已存在,写入的内容会覆盖原文件中的内容
      2. MODE_APPEND:如果该文件已存在,就往文件中追加内容
      3. MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE:允许其他应用对我们程序中的文件进行读写操作,容易引起安全漏洞,在Android4.2版本中被废弃
    3. 返回值:FileOutputStream对象
    4. 示例:将EditText中输入的内容保存在文件中
      1. 在xml布局中添加xml控件,作为用户数据输入的入口

        <EditText
        		android:id="@+id/edit"
        		android:layout_width="match_parent"
        		android:layout_height="wrap_content"
        		android:hint="type content there"
        />
        
      2. 修改活动中的数据处理Java代码

        public class MainActivity extends AppCompatActivity {
        		private EditText edit;
        		@override
        		protected void onCreate(Bundle savedInstanceState) {
        				super.onCreate(savedInstanceState);
        				setContentView(R.layout.activity_main);//设置活动的布局为 "activity_main"
        				edit=(EditText) findViewById(R.id.edit);//绑定布局中的文本输入框
        		}
        		@override
        		protected void onDestroy() {
        				super.onDestroy();
        				String inputText=edit.getText().toString();//从文本输入框 (edit) 中获取用户输入的文本,并将其转换为字符串类型。
        				save(inputText);//调用自定义的 save 方法,将获取到的文本保存到文件中
        		}
        		public void save(String inputText) {
        				FileOutputStream out=null;//声明一个文件输出流变量 out,初始值为 null。
        				BufferedWriter writer=null;//明一个缓冲字符写入流变量 writer,初始值为 null。
        				//捕获可能抛出的异常
        				try {
        						out=openFileOutput("data",Context.MODE_PRIVATE);//打开一个文件输出流,文件名为 "data",并指定文件操作模式为 Context.MODE_PRIVATE
        						writer=new BufferedWriter(new OutputStreamWriter(out));//创建一个缓冲字符写入流,将文件输出流包装在其中,以提高写入效率。
        						writer.write(inputText);//将用户输入的文本写入文件
        				} catch(IOException e) {
        						e.printStackTrace();
        				} finally {
        						try {
        								if(writer!=null) {
        										writer.close()
        						}
        						} catch(IOException e) {
        								e.printStackTrace();
        						}
        				}
        		}
        }
        
  2. 从文件中读取数据:Context类提供了openFileInput方法

    1. 参数:要读取的文件名(系统会自动到/data/data/<package name>/files/目录下去加载文件)
    2. 返回值:FileInputStream对象
    3. 示例:上一部分代码实现了将用户在文本输入框中输入的数据存入文件中,实现数据持久化保存,以下代码将重新读取文件中保存的数据,应用场景:重新启动程序时保留上次输入的内容。
    public class MainActivity extends AppCompatActivity {
    		private EditText edit;
    		@override
    		protected void onCreate(Bundle savedInstanceState) {
    				super.onCreate(savedInstanceState);
    				setContentView(R.layout.activity_main);//设置活动的布局为 "activity_main"
    				edit=(EditText) findViewById(R.id.edit);//绑定布局中的文本输入框
    				String inputText=load();//调用自定义的 load 方法,加载之前保存在 "data" 文件中的文本内容
    				//使用 TextUtils.isEmpty 检查加载的文本内容是否为空
    				if(!TextUtils.isEmpty(inputText()) {
    						edit.setText(inputText);//如果文本内容不为空,将文本输入框 (edit) 的文本设置为加载的内容
    						edit.setSelection(inputText.length());//将文本输入框的光标移动到文本的末尾
    						Toast.makeText(this,"successfully restored",Toast.LENGTH_SHORT).show();
    				}
    				//加入上文中将数据保存入data文件的代码
    				//......
    				//自定义load方法
    				public String load() {
    						FileInputStream in=null;//声明一个文件输入流变量 in,初始值为 null。
    						BufferedReader reader=null;//声明一个缓冲字符读取流变量 reader,初始值为 null。
    						StringBuilder content=new StringBuilder();
    						try {
    								in=openFileInput("data");//打开一个文件输入流,文件名为 "data",即之前保存数据的文件
    								reader=new BufferedReader(new InputSteamReader(in));
    								String line="";//声明一个字符串变量 line,用于存储每次读取的一行文本。
    								while((line=reader.readline())!=null) {
    										content.append(line);//使用 readLine() 方法逐行读取文本内容,直到读取到文件末尾,将每行读取的文本追加到 StringBuilder 中
    								}
    						} catch(IOException e) {
    								e.printStackTrace();
    						} finally {
    								if (reader !=null) {
    										try {
    												reader.close();
    										} catch(IOException e) {
    												e.printStackTrace();
    										}
    								}
    						}
    				return content.toString();//返回加载的文本内容,将 StringBuilder 转换为字符串
    		}
    }
    

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IP_FF02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值