Android 数据存储之文件存储

文件存储

文件存储是 Android 中最基本的一种数据存储方式, 它不对存储的内容进行任何的格式化处理, 所有数据都是原封不动地保存到文件当中的, 因而它比较适合用于存储一些简单的文本数据或二进制数据。 如果你想使用文件存储的方式来保存一些较为复杂的文本数据, 就需要定义一套自己的格式规范,这样方便于之后将数据从文件中重新解析出来。

将数据存储到文件中

Context 类中提供了一个 openFileOutput ()方法,可以用于将数据存储到指定的文件中。这个方法接收两个参数, 第一个参数是文件名, 在文件创建的时候使用的就是这个名称, 注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/packagename/files/ 目 录 下 的 。 第 二 个 参 数 是 文 件 的 操 作 模 式 , 主 要 有 两 种 模 式 可 选 ,MODE_PRIVATE 和 MODE_APPEND。
其实文件的操作模式本来还有另外两种, MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE, 这两种模式表示允许其他的应用程序对我们程序中的文件进行读写操作, 不过由于这两种模式过于危险,很容易引起应用的安全性漏洞,现已在 Android 4.2 版本中被废弃。
openFileOutput ()方法返回的是一个 FileOutputStream 对象, 得到了这个对象之后就可以使用 Java 流的方式将数据写入到文件中了。以下是一段简单的代码示例,展示了如何将一段文本内容保存到文件中:

public void save(){
    String data="data is saved!"
    FileOutputStream  out=null;
    BufferedWriter writer=null;
    try{
         out=openFileOutput("data",Context.MODE_PRIVATE);
         writer=new BufferedWriter(new OutputStreamWriter(out));
         writer.write(data);
   }catch(IOException){
         e.printStackTrace;
   }finally{
         try{
              if(writer!=null){ 
                  writer.close();
               }
             }catch(IOException e){
               e.printStackTrace;
            }
   }
}

这里通 过openFileOutput() 方法能够得到一个 FileOutputStream 对象,然后再借助它构建出一 个OutputStreamWriter 对象,接着再使用 OutputStreamWriter 构建出一个 BufferedWriter 对象,这样你就可以通过 BufferedWriter 来将文本内容写入到文件中了。

在安卓开发中如何实现对数据保存到文件呢?

下面我们就编写一个完整的例子, 借此学习一下如何在 Android 项目中使用文件存储的技术。 首先创建一个 FileSaved 项目 , 并修改 activity_main.xml 中的代码, 如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Type something here" />

</LinearLayout>

这里只是在布局中加入了一个 EditText,用于输入文本内容。其实现在你就可以运行一下程序了, 界面上肯定会有一个文本输入框。 然后在文本输入框中随意输入点什么内容, 再按下 Back 键,这时输入的内容肯定就已经丢失了,因为它只是瞬时数据,在活动被销毁后就会被回收。而这里我们要做的,就是在数据被回收之前,将它存储到文件当中。修改MainActivity 中的代码,如下所示:

public class MainActivity extends Activity {
    private EditText inputEdit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        inputEdit = (EditText) findViewById(R.id.edit);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String inputText = inputEdit.getText().toString();
        save(inputText);
    }

    private void save(String inputText) {
        FileOutputStream out=null;
        BufferedWriter writer=null;

        try {
            out=openFileOutput("data", Context.MODE_PRIVATE);
            writer=new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (writer!=null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

首先在 onCreate()方法中获取了 EditText 的实例, 然后重写了 onDestroy()方法, 这样就可以保证在活动销毁之前一定会调用这个方法。 在 onDestroy()方法中我们获取了 EditText 中输入的内容, 并调用 save()方法把输入的内容存储到文件中, 文件命名为 data。现在重新运行一下程序,并在 Editext 中输入一些内容,如图所示:

这里写图片描述

然后按下 Back 键关闭程序,这时输入的内容就已经保存到文件了。那么如何才能证实数据确实已经保存成功了呢?可以借助 DDMS 的 File Explorer 来查看一下。 切换到 DDMS 视 图 , 并 点 击 File Explorer 切 换 卡 , 在 这 里 进 入 到 /data/data/com.example.shijj.filesaved/files/目录下,可以看到生成了一个 data 文件,如图所示。

这里写图片描述

然后点击图中最左边的按钮可以将这个文件导出到电脑上。

这里写图片描述

使用EditPlus打开这个文件,里面的内容如图所示。

这里写图片描述

这样就证实了,在 EditText 中输入的内容确实已经成功保存到文件中了。不过只是成功将数据保存下来还不够,还需要想办法在下次启动程序的时候让这些数据能够还原到 EditText 中,因此接下来我就要展示如何从文件中读取数据。

如何实现对数据从文件中的读取

类似于将数据存储到文件中, Context 类中还提供了一个 openFileInput()方法, 用于从文件中读取数据。这个方法要比 openFileOutput()简单一些,它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/package name/files/目录下去加载这个文件,并返回一个FileInputStream 对象,得到了这个对象之后再通过 Java 流的方式就可以将数据读取出来了。
以下是一段简单的代码示例,展示了如何从文件中读取文本数据:

  private String load() {
        FileInputStream fis = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();

        try {
            fis = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(fis));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content.append(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }

首先通过 openFileInput()方法获取到了一个 FileInputStream 对象,然后借助它又构建出了一个 InputStreamReader 对象,接着再使用 InputStreamReader 构建出一个BufferedReader 对象,这样就可以通过 BufferedReader 进行一行地读取,把文件中所有的文本内容全部读取出来并存放在一个 StringBuilder 对象中, 最后将读取到的内容返回就可以了。
了解了从文件中读取数据的方法,就可以重新完善一下刚刚写的demo, 使得重新启动程序时 EditText中能够保留我们上次输入的内容。 修改 MainActivity中的代码, 如下所示:

public class MainActivity extends Activity {
    private EditText inputEdit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        inputEdit = (EditText) findViewById(R.id.edit);
        String inputText = load();
        if (!TextUtils.isEmpty(inputText)) {
            inputEdit.setText(inputText);
            inputEdit.setSelection(inputText.length());
            Toast.makeText(MainActivity.this, "Restoring Successed", Toast.LENGTH_SHORT).show();

        }
    }

    private String load() {
        FileInputStream fis = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();

        try {
            fis = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(fis));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content.append(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }

这里的思路非常简单, 在 onCreate()方法中调用 load()方法来读取文件中存储的文本内容, 如果读到的内容不为空, 就调用 EditText 的 setText()方法将内容填充到 EditText里,并调用 setSelection 方法将输入光标移动到文本的末尾位置以便于继续输入,然后弹出一句还原成功的提示。 load()方法中的细节我们前面已经讲过了。

注意上述代码在对字符串进行非空判断的时候使用了 TextUtils.isEmpty()方法,这是一个非常好用的方法, 它可以一次性进行两种空值的判断。 当传入的字符串等于 null 或者等于空字符串的时候, 这个方法都会返回 true, 从而使得我们不需要单独去判断这两种空值, 再使用逻辑运算符连接起来了。现在重新运行一下程序,刚才保存的 Content 字符串肯定会被填充到 EditText 中,然后编写一点其他的内容, 比如在 EditText 中输入 diaomao, 接着按下 Back 键退出程序, 再重新启动程序,这时刚才输入的内容并不会丢失,而是还原到了 EditText 中,如图 所示:

这里写图片描述

到这里文件存储方面的基本内容已经涵盖的差不多了,其实所用到的核心技术就是 Context类中提供的 openFileInput()和 openFileOutput()方法, 之后就是利用 Java 的各种流来进行读写操作就可以了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值