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

前提:最近遇到一个小的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的结果:
数据储存(1):文件存储,保存至/data/data/
数据储存(1):文件存储,保存至/data/data/

在看MODE_APPEND的结果:
数据储存(1):文件存储,保存至/data/data/
数据储存(1):文件存储,保存至/data/data/

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

你可能感兴趣的:(Android)