赞
踩
目录
文件存储是 Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式 化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。
一个简单的例子存储数据:
- package com.example.test;
-
- import androidx.appcompat.app.AppCompatActivity;
- import android.os.Bundle;
- import java.io.BufferedWriter;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStreamWriter;
-
-
- public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- save();
- }
-
- public void save() {
- String data = "Something need to be saved";
- FileOutputStream fileOutputStream = null;
- BufferedWriter bufferedWriter = null;
-
- try {
- //saveData为文件名, Mode_PRIVATE是默认的操作模式,即内容直接覆盖
- fileOutputStream = openFileOutput("savedData", MODE_PRIVATE);
- //将字节流转换为字符留,然后利用该字符流新建一个缓冲字符流
- bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
- //写入数据
- bufferedWriter.write(data);
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- //关闭资源
- try {
- if (null != bufferedWriter) {
- bufferedWriter.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }

运行后结果如下,可见在android文件系统里已经保存了相应的数据:
Context 类中还提供了一个 openFileInput()方法,用于从文件中读取数据。这个方法要比 openFileOutput()简单一些,它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data//files/目录下去加载这个文件,并返回一个 FileInputStream 对象,得到了这个对象之后再通过 Java 流的方式就可以将数据读取出来了
activity_main.xml
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <EditText
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/input"
- android:hint="Input something here"
- />
-
- </LinearLayout>
MainActivity.java
- package com.example.test;
-
- import androidx.appcompat.app.AppCompatActivity;
- import android.os.Bundle;
- import android.widget.EditText;
- import java.io.BufferedWriter;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStreamWriter;
-
-
- public class MainActivity extends AppCompatActivity {
- private static final String TAG = "MainActivity";
- EditText editText;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- editText = (EditText) findViewById(R.id.input);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- // 活动销毁时保存数据
- String data = String.valueOf(editText.getText());
- save(data);
- }
-
- public void save(String data) {
- FileOutputStream fileOutputStream = null;
- BufferedWriter bufferedWriter = null;
-
- try {
- //saveData为文件名, Mode_PRIVATE是默认的操作模式,即内容直接覆盖
- fileOutputStream = openFileOutput("savedData", MODE_PRIVATE);
- //将字节流转换为字符留,然后利用该字符流新建一个缓冲字符流
- bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
- //写入数据
- bufferedWriter.write(data);
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- //关闭资源
- try {
- if (null != bufferedWriter) {
- bufferedWriter.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }

- package com.example.test;
-
- import androidx.appcompat.app.AppCompatActivity;
- import android.os.Bundle;
- import android.widget.EditText;
- import android.widget.Toast;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
-
-
- public class MainActivity extends AppCompatActivity {
- private EditText editText;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- editText = findViewById(R.id.input);
- String data = load(); //加载数据
- if (!data.isEmpty()) {
- editText.setText(data); //恢复数据
- editText.setSelection(data.length());
- Toast.makeText(this, "restored data successfully", Toast.LENGTH_LONG).show();
- }
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- // 活动销毁时保存数据
- String data = String.valueOf(editText.getText());
- save(data);
- }
-
- //save data
- public void save(String data) {
- FileOutputStream fileOutputStream;
- BufferedWriter bufferedWriter = null;
-
- try {
- //saveData为文件名, Mode_PRIVATE是默认的操作模式,即内容直接覆盖
- fileOutputStream = openFileOutput("savedData", MODE_PRIVATE);
- //将字节流转换为字符留,然后利用该字符流新建一个缓冲字符流
- bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
- //写入数据
- bufferedWriter.write(data);
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- //关闭资源
- try {
- if (null != bufferedWriter) {
- bufferedWriter.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- //load data
- public String load() {
- FileInputStream fileInputStream;
- BufferedReader bufferedReader = null;
- StringBuilder data = new StringBuilder();
- try {
- fileInputStream = openFileInput("savedData");
- bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
- //每次读取一行
- String line;
- while (( line = bufferedReader.readLine()) != null) {
- data.append(line);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (bufferedReader != null) {
- try {
- bufferedReader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return data.toString();
- }
- }

文件存储所用到的核心技术就是Context类中提供的openFileInput()和openFileOutput()方法,之后就是利用各种IO流来进行读写操作。 不过,正如我前面所说,文件存储的方式并不适合用于保存一些较为复杂的结构型数据。
使用SharedPreferences来存储数据,首先需要获取到SharedPreferences对象。Android 中主要提供了三种方法用于得到 SharedPreferences 对象。
主要可以分为三步实现:
下面看一个例子:
更改activity_main.xml,不做任何复杂的功能,只是简单地放置了一个按钮,用于将一些数据存储到 SharedPreferences 文件当中。
- <?xml version="1.0" encoding="utf-8"?>
- <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"
- android:orientation="vertical"
- tools:context=".MainActivity">
-
- <Button
- android:id="@+id/save_data"
- android:text="Save Data"
- android:textSize="40dp"
- android:textAllCaps="false"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginTop="350dp"
- />
-
- </LinearLayout>

MainActivity.java
- package com.example.sharedpreferencestest;
-
- import androidx.appcompat.app.AppCompatActivity;
-
- import android.content.SharedPreferences;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
-
- public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button buttonSavedData = findViewById(R.id.save_data);
- buttonSavedData.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- SharedPreferences.Editor editor = getSharedPreferences("savedData",
- MODE_PRIVATE).edit();
- //添加一些数据(键值对的形式)
- editor.putString("name", "zhoufuming");
- editor.putInt("age", 25);
- editor.putBoolean("married", false);
- //提交数据
- editor.commit();
- }
- });
- }
- }

运行代码,界面显示如下:
点击Save Data按钮后,查看系统内部,出现了文件savedData.xml文件,内容也正是所输入的。
SharedPreferences 对象中提供了一系列的get方法用于对存储的数据进行读取,每种get方法都对应了SharedPreferences. Editor中的一种 put 方法,比如读取一个布尔型数据就使用getBoolean()方法,读取一个字符串就使用 getString()方法。这些getXXX方法都接收两个参数,第一个参数是键,传入存储数据 时使用的键就可以得到相应的值了,第二个参数是默认值,即表示当传入的键找不到对应的值时,会以什么样的默认值进行返回。
在 SharedPreferencesTest 项目的基础上修改 activity_main.xml 中的代码,增加了一个读取数据的按钮,如下所示:
- <?xml version="1.0" encoding="utf-8"?>
- <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"
- android:orientation="horizontal"
- tools:context=".MainActivity">
-
- <Button
- android:id="@+id/save_data"
- android:text="Save Data"
- android:textSize="20dp"
- android:textAllCaps="false"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dp"
- />
-
- <Button
- android:id="@+id/read_data"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="60dp"
- android:text="Read Data"
- android:textAllCaps="false"
- android:textSize="20dp"
- />
-
- </LinearLayout>

布局如下图所示:
然后更改MainActivity.java中的代码,如下所示:
运行程序,然后点击Read_Data的按钮,可以观察到打印如下:
SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID 事务,所以只要你以前使用过其他的 关系型数据库,就可以很快地上手 SQLite。文件存储和SharedPreferences存储只适用于去保存一些简单的数据和键值对,SQLite用于需要存储大量复杂的关系型数据的时候。
运用SQLite保存数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。