Android 入门(7)——文件持久化存储
我们在编程的时候,难免会遇到数据保存的情况。例如,当我们与别人进行聊天的时候,发送的消息或者接收到的消息,肯定不能发完之后切换一个页面,再切换回来之后就消失了。想必那样的程序一定是让人抓狂的。
这篇文章我们将介绍一下Android的两种简单的文件存储方式
- 文件存储
- SharedPreferences 存储
将数据存储在文件中
Android提供了一个函数openFileOutPut用于进行文件创建与打开,这个函数有两个参数,一个是文件的名字,另一个是打开的方式。
Context.MODE_PRIVATE
(默认模式,打开文件并覆盖写入)
Context.MODE_APPEND
(后加模式,打开文件并追加到后面)
openFileOutPut返回一个FileOutputStream对象
然后利用BufferedWriter的write方法将数据写入文件中
示例
创建一个新的项目FileIOTest,打开active_main.xml编写以下界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/put_data"
android:hint="output data"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/get_data"
android:hint="input data"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/put_button"
android:text="put"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/get_button"
android:text="get"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
效果 效果图
接下来打开MainActivity.java,进行我们的主代码编写
public class MainActivity extends AppCompatActivity {
private Button getButton;
private Button putButton;
private EditText putEdit;
private EditText getEdit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getButton = (Button)findViewById(R.id.get_button);
putButton = (Button)findViewById(R.id.put_button);
putEdit = (EditText)findViewById(R.id.put_data);
getEdit = (EditText)findViewById(R.id.get_data);
putButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String getData = putEdit.getText().toString();
saveData(getData);
}
});
}
void saveData(String inputText){
FileOutputStream out = null;
BufferedWriter writer = null;
try{
out = openFileOutput("data",Context.MODE_APPEND);
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();
}
}
}
void getData(){
String get_Data = "";
}
}
- 代码有点长,我们分开来看。首先看oncreate函数里面。我们主要是获取了每一个控件的引用,并且给putButton设置点击事件。
- 然后获取FileOutPutStream对象,利用这个对象初始化写入对象BufferedWriter。
- 最后利用writer.write(data)写入。
从文件中获取数据
由于只是写入数据不够全面,这里将获取数据一同作为一个整体讲解。
Android给我们同样提供了读取数据函数openFileInput,这个函数指需要传进去一个参数,就是文件名。
使用也很简单,通过openFileInput获取FileInputString对象,利用FileInputStream对象初始化BufferedReader,然后利用BufferedReader的readLine读取数据。
String getData(){
String inputString= "";
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder builder = new StringBuilder();
try{
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
while((inputString = reader.readLine())!=null){
builder.append(inputString);
}
}catch (IOException e){
e.printStackTrace();
}finally {
if(reader!=null){
try {
reader.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return builder.toString();
}
上述代码实现读取data文件并且将所有数据都读出来
在主函数进行点击事件写入
getButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String getString = getData();
getEdit.setText(getString);
}
});
效果
输入三次数据,第一次输入firstdata,第二次seconddata,第三次thirddata,最后获取所有输入的数据,即为测试成功
测试
使用SharedPerferences
SharedPerferences存储文件格式为xml
存储格式为键、值对。
Context中getSharedPerferences,第一个用于指定存储文件名,第二个用于打开文件格式。
目前打开格式只有:MODE_PRIVATE
使用步骤:
- 调用SharedPreferences对象的edit()函数返回一个SharedPreferenced.Editor对象
- 利用各种put函数向SharedPreferences.Editor中传入数据
如传入String使用putString()。 - 使用apply()提交数据。
制作简单界面
界面<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/your_id"
android:hint="Id"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<EditText
android:id="@+id/your_password"
android:hint="Password"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
<Button
android:id="@+id/button"
android:text="set_Message"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
主函数
public class MainActivity extends AppCompatActivity {
Button button;
EditText idEdit;
EditText passwordEdit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button =(Button)findViewById(R.id.button);
idEdit = (EditText)findViewById(R.id.your_id);
passwordEdit = (EditText)findViewById(R.id.your_password);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String Id = idEdit.getText().toString();
String Password = passwordEdit.getText().toString();
SharedPreferences.Editor editor = getSharedPreferences("DataList",MODE_PRIVATE).edit();
editor.putString("Id",Id);
editor.putString("password",Password);
editor.apply();
}
});
}
}
输入数据
使用查看DataList.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="password">4787897894984</string>
<string name="Id">154967797</string>
</map>
获取存入的数据也很简单,使用getSharedPreferences获取SharedPreferences对象,然后使用getString(键)来获取相应的值