前提:最近遇到一个小的DVB项目,虽然数据都是有底层提供给我们的,但是应用层还是要对一些基本的数据进行处理,例如保存上次一播放的频道号,下一次记忆播放等。所以就需要做一些简单的数据存储。然后也想对Android的数据存储做一个总结,也算是自己做的笔记。
首先是文件存储,就是将一些简单的文本数据保存下来,例如频道号等等当然也可以用来存储稍微复杂一点的数据,例如一个json,如果是json可是数据就需要自己解析的时候定义一个规范。此博客以简单的文本消息为例。
转载请注明出处http://blog.csdn.net/Zou_pl/article/details/73921092
将数据以Java流的格式写入文件和读取。
简单的布局,可以忽略:
<android.support.constraint.ConstraintLayout
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"
tools:context="www.sunniwell.net.testdatastorage.MainActivity">
<LinearLayout
android:layout_width="368dp"
android:layout_height="wrap_content"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:orientation="horizontal"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
>
<EditText
android:id="@+id/edt_data_save"
android:layout_width="0dp"
android:layout_weight="8"
android:layout_height="wrap_content"
android:textSize="25sp"
android:hint="Type what you want..."/>
<Button
android:id="@+id/btn_data_save"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content"
android:text="Data Save "/>
<Button
android:id="@+id/btn_data_show"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content"
android:text="Data Show "/>
LinearLayout>
android.support.constraint.ConstraintLayout>
就是一个EditText输入你要保存的文本,然后一个Button点击保存,Yi个Button点击展示:
package www.sunniwell.net.testdatastorage;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
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;
public class MainActivity extends AppCompatActivity {
private EditText mDataEditText = null;
private Button mDataSaveButton = null;
private Button mDataShowButton = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDataViews();
}
private void initDataViews() {
mDataEditText = (EditText)findViewById(R.id.edt_data_save);
mDataSaveButton = (Button)findViewById(R.id.btn_data_save);
mDataSaveButton.setOnClickListener(mDataButtonClickListener);
mDataShowButton = (Button)findViewById(R.id.btn_data_show);
mDataShowButton.setOnClickListener(mDataButtonClickListener);
}
private View.OnClickListener mDataButtonClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != v) {
switch (v.getId()) {
case R.id.btn_data_save: {
//点击保存按钮,拿到需要保存的文本,进行保存
String content = mDataEditText.getText().toString();
saveStringToData("DataStorage",content);
}
break;
case R.id.btn_data_show: {
//点击显示按钮,Toast出来保存的内容
String result = getStringFromData("DataStorage");
if (TextUtils.isEmpty(result)) {
Toast.makeText(MainActivity.this, "get Nothing", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "get:"+result, Toast.LENGTH_SHORT).show();
}
}
}
}
}
};
...
...
}
上面是处理的逻辑,重点看saveStringToData(“DataStorage”,content)和getStringFromData(“DataStorage”)方法:
写:
private void saveStringToData(String fineName ,String content) {
FileOutputStream fileOutputStream = null;
BufferedWriter bufferedWriter = null;
try {
/**
* 1、首先通过openFileOutput()方法返回一个FileOutputStream对象
* 需要传入两个参数:
* ①文件名,文件创建的时候使用这个名称,默认文件保存在/data/data/包名/files/目录下
* ②:文件的操作模式:MODE_PRIVATE表示当再次储存指定同样文件名时,所写的内容会覆盖源=原文件内容
* MODE_APPEND表示当次储存指定同样文件名时,如果已经存在该文件,会在以往文件中追加内容
* MODE_WORLD_READABLE、MODE_WORLD_READABLE不推荐
*2、得到FileOutputStream对象,来新建OutputStreamWriter对象,来新建BufferedWriter对象
* 3、使用BufferedWriter对象储存
* openFileOutput()-FileOutputStream-OutputStreamWriter-BufferedWriter
* */
fileOutputStream = openFileOutput(fineName,MODE_PRIVATE);
bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
bufferedWriter.write(content);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufferedWriter != null) {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
读:
private String getStringFromData(String fileName) {
StringBuilder stringBuilder = new StringBuilder();
FileInputStream fileInputStream = null;
BufferedReader bufferedReader = null;
try {
/**
* openFileInput() - FileInputStream - InputStreamReader - BufferedReader
* BufferedReader..readLine()逐行读取
*
* */
fileInputStream = openFileInput(fileName);
bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String line = "";
try {
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return stringBuilder.toString();
}
例如openFileOutput()方法的文件的操作模式:MODE_PRIVATE表示当再次储存指定同样文件名时,所写的内容会覆盖原文件内容,MODE_APPEND表示当次储存指定同样文件名时,如果已经存在该文件,会在以往文件中追加内容,MODE_WORLD_READABLE、MODE_WORLD_READABLE不推荐。
先看:MODE_PRIVATE的结果:
最后:对于一些简单或者不长的文本我想这种存储方式就够了,特别时候用于一些轻量级的项目中。如果数据比较多,也可以一json的格式存储读取并解析,例如:{“title”: “test local data”,”url”: “http://106.14.47.XX:5002/XX.ts“,”duration”: 2000}。