今天两场考试,不过还好,都是开卷,哈哈。。下午放松,晚上继续学习,本来想写一下litepal的各种增删查改,但是从两个角度来看,至少现在来说是没有必要写了:其一,自己在近期应该不会用到,而且用到的时候看自己的那篇博文就应该能行;其二网上有那么多大神写了一系列关于litepal的用法,到时候自己再去查也不迟,所以就不写了。但是也不能了浪费大好时光,时间也不多了,所以学习一下文件存储吧。(废话一大堆,,接下来就不说废话了。。)
今天学文件存储,文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动的保存到文件当中,因而它比较适合用于存储一些简单的文本数据或者二进制数据。如果你想使用文件存储的方式来保存一些较为复杂的文本数据,就需要定义一套自己的格式规范以方便将数据从文件中重新解析出来。
(此次所用工具为Eclipse)
将数据存储到文件中:
Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。这个方法有两个参数,第一个参数是文件名,在文件创建的时候使用的就是这个名称,(文件的位置是默认 存储到/data/data/packagename/files/目录下的)第二个参数就是文件的操作模式,主要有两种模式可选:MODE_PRIVATE和 MODE_APPEND,其中MODE_PRIVATE是默认的操作模式,表示当指定文件已存在,所写入的内容将会覆盖源文件中的内容,而MODE_APPEND则表示如果该文件已存在,就往文件里追加内容,不存在就创建新文件。
通过openFileOutput()方法得到一个FileOutputStream对象,然后再借助它构建出一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferWriter对象,这样就可以通过BufferWriter来将文本写入到文件中了。
如代码:
public void save(String text) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(text);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
代码中里边的传入文本参数,将文本存储到文件中,文件命名为data。
从文件中读取数据:
类似于将数据存储到文件中,Context类中还提供了一个openFilleInput()方法,用于从文件中读取数据,这个方法要比openFilleOutput()方法简单一些,它只接受一个参数,即要读取的文件名,然后系统将会自动到/data/data/packagename/files/目录下去加载这个文件,并发乎一个FileInputStream对象,得到了这个对象之后再通过Java流的方式就可以将数据读取出来了。
代码如:
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return content.toString();
}
这段代码中,首先通过OpenFileInput()
方法获取到一个FileInputStream对象,然后接住他又构建出一个InputStreamReader对象,接着再使用InputStreamReader构建出一个BufferReader对象,这样我们就可以通过BufferReader进行一行行地读取,把文件中所有的文本内容全部读取出来,并保存在StringBuilder对象中,最后将读取到的内容返回就可以了。
下边展示所有的代码:
MainActivity.java
package com.example.pratice_data;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
Button btn_write, btn_read;
EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_write = (Button) findViewById(R.id.id_btn_write);
btn_read = (Button) findViewById(R.id.id_btn_read);
edit = (EditText) findViewById(R.id.id_edit);
btn_write.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String text = edit.getText().toString();
save(text);
}
});
btn_write.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String text = edit.getText().toString();
save(text);
}
});
btn_read.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String text = load();
if(!TextUtils.isEmpty(text)){
edit.setText(text);
Toast.makeText(MainActivity.this, "读取成功!", Toast.LENGTH_SHORT).show();
}
}
});
}
public void save(String text) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(text);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return content.toString();
}
}
activity_main.xml
上边的代码中,当我们运行之后,在文本框中输入我们要存储的内容,然后点击存储按钮,我们的信息就会保存到文件data中。此时我们把文本框中的内容删掉,点击读取按钮,刚才我们保存的文本信息就出现在了文本框里。大功告成了!(load()方法来读取文本中的内容,如果读到的内容不为null,就将读到的内容显示在文本框中。其中TextUtils.isEmpty()方法是一个非常好的方法,,它可以一次性进行两种空值的判断,当传入的字符串等于null或者等于空字符串的时候这个方法都会返回true)运行结果如下:
在文本框中输入内容后,点击存储按钮,进入File Explorer标签页,找到/data/data/practice_data/files/里边有已经生成的文件:data,导出到电脑中,用记事本打开:
然后我们清空文本框中的内容,点击读取,就会出现我们保存的内容。
(今天就到这了,其中,自己不懂StringBuilder 和 StringBuffer,改天自己学习一下)
以上。