数据储存(1):文件存储,保存至/data/data/"package_name"/files/目录下

来源:互联网 发布:mac更换登录帐号 编辑:程序博客网 时间:2024/05/22 09:03

前提:最近遇到一个小的DVB项目,虽然数据都是有底层提供给我们的,但是应用层还是要对一些基本的数据进行处理,例如保存上次一播放的频道号,下一次记忆播放等。所以就需要做一些简单的数据存储。然后也想对Android的数据存储做一个总结,也算是自己做的笔记。
首先是文件存储,就是将一些简单的文本数据保存下来,例如频道号等等当然也可以用来存储稍微复杂一点的数据,例如一个json,如果是json可是数据就需要自己解析的时候定义一个规范。此博客以简单的文本消息为例。
转载请注明出处http://blog.csdn.net/Zou_pl/article/details/73921092

将数据以Java流的格式写入文件和读取。

简单的布局,可以忽略:

<?xml version="1.0" encoding="utf-8"?><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的结果:
这里写图片描述
这里写图片描述

在看MODE_APPEND的结果:
这里写图片描述
这里写图片描述

最后:对于一些简单或者不长的文本我想这种存储方式就够了,特别时候用于一些轻量级的项目中。如果数据比较多,也可以一json的格式存储读取并解析,例如:{“title”: “test local data”,”url”: “http://106.14.47.XX:5002/XX.ts“,”duration”: 2000}。

阅读全文
0 0