新思想

文件存储

DataStorage

 


activity_main.xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:columnCount="2"
    android:rowCount="9"
    tools:context="com.xiesir.example15datastoragebyfile.MainActivity">

    <TextView
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:text="个人信息"
        android:textAlignment="center"
        android:textSize="28sp" />

    <TextView
        android:text="姓名" />
    <EditText
        android:id="@+id/etName"
        android:layout_gravity="right"
        android:gravity="right"
        android:minWidth="180dp"
        android:hint="请输入姓名" />

    <TextView
        android:text="性别" />
    <Switch
        android:id="@+id/sSex"
        android:layout_gravity="center_horizontal"
        android:minWidth="120dp"
        android:showText="true"
        android:textOff="男"
        android:textOn="女" />

    <TextView
        android:layout_gravity="center_vertical"
        android:text="颜值" />
    <RatingBar
        android:id="@+id/rbBeauty"
        style="@style/Widget.AppCompat.RatingBar.Indicator"
        android:isIndicator="false"
        android:layout_gravity="right"
        android:layout_width="wrap_content"
        android:numStars="5"
        android:rating="3.5"
        android:stepSize="0.5" />

    <TextView
        android:text="生日" />
    <EditText
        android:id="@+id/etBirthday"
        android:layout_gravity="end"
        android:gravity="right"
        android:minWidth="180dp"
        android:inputType="date"
        android:hint="请输入出生日期" />

    <TextView
        android:text="年薪" />
    <EditText
        android:id="@+id/etSalary"
        android:layout_gravity="end"
        android:gravity="right"
        android:minWidth="180dp"
        android:inputType="number"
        android:hint="请输入年薪" />

    <CheckBox
        android:id="@+id/cbRaw"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="保存在内存" />
    <CheckBox
        android:id="@+id/cbSD"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="保存在外存" />

    <Button
        android:id="@+id/btnSave"
        android:text="保存"
        android:onClick="click" />
    <Button
        android:id="@+id/btnRead"
        android:layout_gravity="center_horizontal"
        android:text="读出"
        android:onClick="click" />
</GridLayout>

 

FileIO.java文件:

package com.xiesir.example15datastoragebyfile;

import android.content.Context;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Created by xiegly on 2016/5/22.
 */
public class FileIO {
    private Context mContext;

    public FileIO() {
    }

    public FileIO(Context mContext) {
        super();
        this.mContext = mContext;
    }

    /*
    * 这里定义的是一个文件保存的方法,写入到文件中,所以是输出流
    * */
    public void save(String filename, String filecontent) throws Exception {
//        FileOutputStream output = mContext.openFileOutput(filename, Context.MODE_PRIVATE);
//        //这里我们使用私有模式,创建出来的文件只能被本应用访问,并且还会覆盖原文件
////        Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
////        Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
////
////        MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
////        MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
//        try {
//            output.write(filecontent.getBytes());  //将String字符串以字节流的形式写入到输出流中
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            output.close();         //关闭输出流
//        }

//        File file = new File("data/data/com.xiesir.example15datastoragebyfile/info.txt");
//        getCacheDir() 等同于 "data/data/当前包名/Cache",是临时缓存文件夹
//        File file = new File(mContext.getCacheDir(), filename);
//        getFilesDir() 等同于 "data/data/当前包名/files"
        File file = new File(mContext.getFilesDir(), filename);
        FileOutputStream fos = new FileOutputStream(file);
        try {
            fos.write(filecontent.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            fos.close();
        }
    }

    /*
    * 这里定义的是文件读取的方法
    * */
    public String read(String filename) throws IOException {
//        FileInputStream input = mContext.openFileInput(filename);
//        byte[] temp = new byte[1024];
//        StringBuilder sb = new StringBuilder("");
//        try {
//            int len = 0;
//            //读取文件内容:
//            while ((len = input.read(temp)) > 0) {
//                sb.append(new String(temp, 0, len));
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            //关闭输入流
//            input.close();
//            return sb.toString();
//        }

//        File file = new File("data/data/com.xiesir.example15datastoragebyfile/info.txt");
//        getCacheDir() 等同于 "data/data/当前包名/Cache",是临时缓存文件夹
//        File file = new File(mContext.getCacheDir(), filename);
//        getFilesDir() 等同于 "data/data/当前包名/files"
        File file = new File(mContext.getFilesDir(), filename);
        if (file.exists()) {
            FileInputStream fis = new FileInputStream(file);
            byte[] temp = new byte[1024];
            StringBuilder sb = new StringBuilder("");
            try {
                int len = 0;
                while ((len = fis.read(temp)) > 0)
                    sb.append(new String(temp, 0, len));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                fis.close();
                return sb.toString();
            }
        } else
            return "";
    }
}

 

 

MainActivity.java文件:

package com.xiesir.example15datastoragebyfile;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Path;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.RatingBar;
import android.widget.SeekBar;
import android.widget.Switch;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.Format;
import java.util.Formatter;

public class MainActivity extends AppCompatActivity {

    final public static int EXTERNAL_STORAGE_REQ_CODE = 10;

    private Context mContext;
    private EditText etName;
    private EditText etBirthday;
    private EditText etSalary;
    private Switch sSex;
    private RatingBar rbBeauty;
    private CheckBox cbRaw;
    private CheckBox cbSD;
    private String io;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = getApplicationContext();
        etName = (EditText) findViewById(R.id.etName);
        etBirthday = (EditText) findViewById(R.id.etBirthday);
        etSalary = (EditText) findViewById(R.id.etSalary);
        sSex = (Switch) findViewById(R.id.sSex);
        rbBeauty = (RatingBar) findViewById(R.id.rbBeauty);
        cbRaw = (CheckBox) findViewById(R.id.cbRaw);
        cbSD = (CheckBox) findViewById(R.id.cbSD);

//        // 获取 SD 卡剩余空间
//        File SD = Environment.getExternalStorageDirectory();
//        StatFs stat = new StatFs(SD.getPath());
//        long blockSize = stat.getBlockSizeLong();
//        long totalBlocks = stat.getBlockCountLong();
//        long availableBlocks = stat.getAvailableBlocksLong();
//        String availableSize = android.text.format.Formatter.formatFileSize(this, blockSize * availableBlocks);
//        etName.setText(availableSize);
    }

    public void click(View v) {
        if (cbRaw.isChecked()) {
            switch (v.getId()) {
                case R.id.btnSave:
                    FileIO fout = new FileIO(mContext);
                    String name = etName.getText().toString();
                    String birthday = etBirthday.getText().toString();
                    String salary = etSalary.getText().toString();
                    double beauty = rbBeauty.getRating();
                    String sex = sSex.isChecked() ? "T" : "F";
                    try {
                        fout.save("myinfo.txt", name + '\n' + birthday + '\n' + salary + '\n' + beauty + '\n' + sex);
                        Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show();
                    } catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show();
                    }
                    break;
                case R.id.btnRead:
                    String detail = "";
                    FileIO fin = new FileIO(getApplicationContext());
                    try {
                        detail = fin.read("myinfo.txt");
                        String info[] = detail.split("\n");
                        etName.setText(info[0]);
                        etBirthday.setText(info[1]);
                        etSalary.setText(info[2]);
                        rbBeauty.setRating(Float.parseFloat(info[3]));
                        sSex.setChecked(info[4].equals("T"));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
//                    Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_LONG).show();
                    break;
            }
        } else if (cbSD.isChecked()) {
            switch (v.getId()) {
                case R.id.btnSave:
                    io = "Save";
                    break;
                case R.id.btnRead:
                    io = "Read";
                    break;
            }
            requestPermission();
        }
    }

    private void sdio() throws IOException {
        // Environment.MEDIA_REMOVED: SD卡不存在
        // Environment.MEDIA_UNMOUNTED: SD卡存在,但是未挂载
        // Environment.MEDIA_CHECKING: SD卡正在检测
        // Environment.MEDIA_MOUNTED: SD卡可用
        // Environment.MEDIA_MOUNTED_READ_ONLY: SD卡可用,但是只读
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//            File file = new File("sdcard/myinfo.txt");
            File file = new File(Environment.getExternalStorageDirectory(), "myinfo.txt");
            switch (io) {
                case "Save":
                    String name = etName.getText().toString();
                    String birthday = etBirthday.getText().toString();
                    String salary = etSalary.getText().toString();
                    double beauty = rbBeauty.getRating();
                    String sex = sSex.isChecked() ? "T" : "F";

                    FileOutputStream fos = new FileOutputStream(file);
                    try {
                        fos.write((name + '\n' + birthday + '\n' + salary + '\n' + beauty + '\n' + sex).getBytes());
                        Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show();
                    } catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show();
                    } finally {
                        fos.close();
                    }
                    break;
                case "Read":
                    if (file.exists()) {
                        FileInputStream fis = new FileInputStream(file);
                        byte[] temp = new byte[1024];
                        StringBuilder sb = new StringBuilder("");
                        try {
                            int len = 0;
                            while ((len = fis.read(temp)) > 0)
                                sb.append(new String(temp, 0, len));
                        } catch (Exception e) {
                            e.printStackTrace();
                        } finally {
                            fis.close();
                        }
                        String info[] = sb.toString().split("\n");
                        etName.setText(info[0]);
                        etBirthday.setText(info[1]);
                        etSalary.setText(info[2]);
                        rbBeauty.setRating(Float.parseFloat(info[3]));
                        sSex.setChecked(info[4].equals("T"));
                    }
                    break;
            }
        }
        else
            Toast.makeText(getApplicationContext(), "SD卡不可用哦,亲。", Toast.LENGTH_SHORT).show();
    }

    public void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {       // Build.VERSION_CODES.M == 23,即 Android 6.0 ,也即 API 23
            //判断当前Activity是否已经获得了该权限
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                //如果App的权限申请曾经被用户拒绝过,就需要在这里跟用户做出解释
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    Toast.makeText(this, "请赋予相应的权限", Toast.LENGTH_SHORT).show();
                } else {
                    //进行权限请求
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_REQ_CODE);
                    return;
                }
            }
            else
                try {
                    sdio();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
        else
            try {
                sdio();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case EXTERNAL_STORAGE_REQ_CODE: {
                // 如果请求被拒绝,那么通常grantResults数组为空
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //申请成功,进行相应操作
                    try {
                        sdio();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    //申请失败,可以继续向用户解释。
                    Toast.makeText(getApplicationContext(), "拒绝访问外部存储器", Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
    }
}

 

 


源程序下载

参考:

 

posted on 2016-05-23 06:40  新思想  阅读(384)  评论(0)    收藏  举报

导航