Android 文件存储

来源:互联网 发布:淘宝男模特 编辑:程序博客网 时间:2024/06/06 02:22

文件存储是Android中最基本的一种数据存储方式,它不对数据进行任何的格式化处理,所有的数据都是原封不动的保存在文件中去,因而比较适合用于存储一些简单的文本数据或二进制数据,如果你想使用文件存储的方式来保存一些较为复杂的文本数据,就需要定义一套自己的格式规范,这样可以方便之后将数据从文件中重新解析出来.
1.将数据存储到文件
Context类中提供了一个openFileOupput()方法,可以用于将数据存储到指定的文件中去,这个方法有两个参数,第一个参数是文件名,在文件创建的时候使用的就是这个名字,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/packagename/files/目录下的,第二个参数是文件的操作模式,主要有两种模式,MODE_PRIVATE和MODE_APPEND.其中MODE_PRIVATE是默认操作模式,表示当指定同样的文件名的时候,所写入的内容将会覆盖原文件中的内容,而MODE_APPEND则表示如果文件已经存在,就往文件里面追加内容,不存在就创建新文件,
openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象之后就可以使用Java流的方式将数据写入到文件中去
activity_main.xml代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <EditText        android:id="@+id/edit"        android:layout_width="match_parent"        android:layout_height="wrap_content"        andorid:hint="Type something here"/></LinearLayout>

MainActivity.class代码:

public class MainActivity extends AppCompatActivity{    private EditText edit;    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        edit = (EditText)findViewById(R.id.edit);    }    @Override    protected void onDestroy(){        super.onDestroy();        String inputText = edit.getText().toString();        save(inputText);    }    public 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 (IOException e) {            e.printStackTrace();        } finally {            try {                if(writer != null) {                    writer.close();                }            } catch(IOException e) {                e.printStackTrace();            }        }    }}

可以看到,首先我们在onCreate()方法中获取EditText实例,然后重写onDestroy()方法,这样就可以保证在活动销毁之前一定会调用这个方法,在onDestroy()方法中我们获取到EditText中输入的内容,并调用save()方法把输入的内容存储到文件中,文件名为data.
save()中的代码是通过openFileOutput()方法能够得到一个FileOutputStream对象,然后借助它构建出一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象,这样你就可以通过BufferedWriter来将文本内容写到文件中去了.

2.从文件中读取数据
类似于将数据存储到文件中,Context类中还提供了一个openFileInput()方法,用于从文件中读取数据,这个方法比openFileOutput()方法简单一些,它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/packagename/files/目录下去加载这个文件,并返回一个FileInputStream对象,得到这个对象之后再通过Java流的方式就可以将数据读取出来,
修改上面MainActivity.class中的代码,使得重新启动程序的时候EditText中能够保留上次输入的内容

public class MainActivity extends AppCompatActivity{    private EditText edit;    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        edit = (EditText)findViewById(R.id.edit);        String inputText = load();        if(!TextUtils.isEmpty(inputText)){            edit.setText(inputText);            edit.setSelection(inputText.length());            Toast.makeText(this,"Restoring succeeded",Toast.LENGTH_SHORT).show();        }    }    ...    public String load(){        FileInputStream in = null;        BufferedReader reader = null;        StringBuilder content = new StringBuilder();        try {            in = openFileInput("data");            reader = new BufferedReader(new InputStreamReader(in));            String line = "";            while((line = reader.readLine()) != null){                content.append(line);            }        } catch (IOException e){            e.printStackTrace();        } finally{            if(reader != null){                try{                    reader.close();                } catch (IOException e){                    e.printStackTrace();                }            }        }        return content.toString();    }}

在onCreate()方法中调用load()方法来读取文件中存储的文本内容,如果读到的内容不为null,就调用EditText的setText()方法将内容填充到EditText中,并调用setSelection()方法将光标移动到文本的末尾位置以便于继续输入,然后弹出一句还原成功的提示.
load()方法通过openFileInput()方法获取到一个FileInputStream对象,然后借助它又构建出一个InputStreamReader对象,接着再使用InputStreamReader构建出一个BufferedReader对象,这样我们就可以通过BufferedReader进行一行行的读取,把文件中所有的文本内容全部读取出来,并存放在一个StringBuilder对象中,最后将读取到的内容返回就可以了.
上面代码在对字符串进行判空的时候使用了TextUtils.isEmpty()方法,这是一个非常好用的方法,它可以一次性进行两种空值的判断,当传入的字符串等于null或等于空字符串的时候,这个方法都会返回true,从而使得我们不需要先单独判断这两种空值再使用逻辑运算符连接起来.

原创粉丝点击