Android中的数据存储(二):文件存储 2017-05-25 08:16 35人阅读 评论(0) 收藏

文件存储

这是本人(菜鸟)学习android数据存储时接触的有关文件存储的知识以及本人自己写的简单地demo,为初学者学习和使用文件存储提供一些帮助。。

如果有需要查看SharedPreferences存储的请查看: Android中的数据存储(一):SharedPreferences

 一:使用范围:
   文件存储很明显就是存储文件,这一点不需要解释了吧!需要注意的是所存储的文件不能太大,以防内存不足。


二:核心原理:
依靠Context(上下文)Context提供了两个方法来打开数据文件里的文件IO流FileInputStream openFileInput(String name); FileOutputStream(String name , int mode)这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式:
模式有以下几种:
1.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Context.MODE_APPEND。
2.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
3.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
4.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
*最常用的是第一种和第二种。
Context还提供了另外的几个方法:
1.getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录。
2.File getFilesDir():获取该应用程序的数据文件夹的绝对路径。
3.String[] fileList():返回该应用数据文件夹的全部文件。


三:注意事项:
1.保存时如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录
2.文件传输时使用IO流,注意流的开和关,只要开流,结束时,必须关流。

接下来是实际代码:

下面的是向文件中保存数据:代码非常简单,就是IO流的运用。




下面是从文件中获取数据:也是简单地IO流运用




说完普通的文件存取,再来说一下特殊文件的存取,即存取SDCard上的文件:

存取SDCard上的文件:
存取思路:
1.调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限。
	Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2.调用Environment.getExternalStorageDirectory()方法来获取外部存储器。
	File file = new File(Environment.getExternalStorageDirectory(),"message.txt")
3.使用IO流操作SD卡上的文件了,这一点和普通文件就没什么区别了。

注意事项:
1.手机应该已插入SD卡,对于模拟器而言,可通过mksdcard命令来创建虚拟存储卡。
2.必须在AndroidManifest.xml上配置读写SD卡的权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

接下来是SDCard文件存取的实际代码:
红色为保存数据,蓝色为获取数据:

package com.example.star.filesavesd.activity;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.example.star.filesavesd.R;
import com.example.star.filesavesd.utils.MyToast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText mEditText;
    private Button mButtonSave;
    private Button mButtonGet;
    private String data;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件
        initView();
        /*设置按钮监听*/
        setlistener();
    }

    /**
     * 初始化控件
     */
    private void initView() {
        mEditText = (EditText) findViewById(R.id.editText);
        mButtonSave = (Button) findViewById(R.id.main_btn_save);
        mButtonGet = (Button) findViewById(R.id.main_btn_get);

    }

    /**
     * 设置按钮监听
     */
    private void setlistener() {
        mButtonSave.setOnClickListener(this);
        mButtonGet.setOnClickListener(this);
    }

    /**
     * 点击事件
     *
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.main_btn_save:
                //保存数据
                saveData();
                break;
            case R.id.main_btn_get:
                //获取数据
                getData();
                break;
            default:
                break;
        }
    }

    /**
     * 保存数据到文件中
     */
    private void saveData() {
        //获取EditText的数据
        data = mEditText.getText().toString().trim();
        //判断数据是否为空
        if (TextUtils.isEmpty(data)){
            MyToast.show(getApplicationContext(),"数据为空");
            return;
        }
        //判断是否存在sd卡,具有读取sd卡的权限
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            try {
                File file = new File(Environment.getExternalStorageDirectory(),"message.txt");
                if (!file.getParentFile().exists()){
                    file.getParentFile().mkdirs();
                }
                BufferedWriter bw = new BufferedWriter(new FileWriter(file,true));
                bw.write(data);
                bw.flush();
                MyToast.show(getApplicationContext(),"数据保存成功");

            } catch (Exception e) {
                e.printStackTrace();
            }

        }else{
            MyToast.show(getApplicationContext(),"保存失败,SD卡不存在!");
        }
    }

    /**
     * 获取文件中的数据
     */
    private void getData() {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

            try {
                File file = new File(Environment.getExternalStorageDirectory(),"message.txt");
                if (!file.getParentFile().exists()){
                    file.getParentFile().mkdirs();
                }
                BufferedReader br = new BufferedReader(new FileReader(file));
                String readline = "";
                StringBuffer sb = new StringBuffer();
                while((readline = br.readLine()) != null){
                    sb.append(readline);
                }
                mEditText.setText(sb.toString());
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }else{
            MyToast.show(getApplicationContext(),"读取失败,SD卡不存在!");
        }
    }
}


SDCard上的文件存储与普通文件存储的不同就在与SDCard的文件还得判断SDCard的状态,其余基本一致。

以上就是本人对文件存储的认识,欢迎各位大神、各位同胞指教。如有问题,请在评论区留下您的问题与建议,或者加QQ:2235792398,一起探讨。



posted @ 2017-05-25 08:16  环球移动团队  阅读(328)  评论(0编辑  收藏  举报