现在的位置: 首页 > 移动开发 > 正文

【Android入门 十三】数据存储

2019年06月03日 移动开发 ⁄ 共 4805字 ⁄ 字号 评论关闭

发觉上篇翻译只注意一些细节,却没有写出数据存储的编程实现,这篇文章通过实例来完整的体现数据存储。
在实践中,发现的主要问题:
读取和写入的字符流和字节流,API文档上的对于FileInputStream的方法write()和read()属于字符流。
assets目录和R,raw目录的区别。
写入时,不可避免的字符编码问题。

package com.study.test02;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class Activity_00 extends Activity {
    private Button btn0, btn1, btn2, btn3, btn4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_activity00);
        btn0 = (Button) findViewById(R.id.btn0_activity00);
        btn1 = (Button) findViewById(R.id.btn1_activity00);
        btn2 = (Button) findViewById(R.id.btn2_activity00);
        btn3 = (Button) findViewById(R.id.btn3_activity00);
        btn4 = (Button) findViewById(R.id.btn4_activity00);
        btn0.setOnClickListener(listener);
        btn1.setOnClickListener(listener);
        btn2.setOnClickListener(listener);
        btn3.setOnClickListener(listener);
        btn4.setOnClickListener(listener);
    }

    private OnClickListener listener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.btn0_activity00:
                readAssetsFile();
                break;
            case R.id.btn1_activity00:
                readSystemFile();
                break;
            case R.id.btn2_activity00:
                writeSystemFile();
                break;
            case R.id.btn3_activity00:
                readSDCardFile();
                break;
            case R.id.btn4_activity00:
                writeSDCardFile();
                break;
            }
        }
    };

    // 目前大多被R.raw代替,用来读取固定不变的数据。
    private void readAssetsFile() {
        AssetManager asm = this.getAssets();
        BufferedReader br = null;
        try {
            InputStream is = asm.open("wom" + File.separator + "file01.txt");
            br = new BufferedReader(new InputStreamReader(is));
            StringBuffer sb = new StringBuffer();
            String str = null;
            while ((str = br.readLine()) != null) {
                sb.append(str + "\n");
            }
            // String str = br.readLine();
            // while(str!=null){
            // sb.append(str+"\n");
            // str = br.readLine();
            // }
            Toast.makeText(this, "Read from assets:" + sb.toString(), 4000)
                    .show();
            is.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /*
     * 读取和写入时字节流和字符流的尝试
     */
    // FileInputStream的read()方法返回是得到的字节数量的整型值,不像write一样经常使用。
    private void readSystemFile() {
        FileInputStream fis = null;
        BufferedReader br = null;

        try {
            fis = this.openFileInput("file03.txt");
            try {
                br = new BufferedReader(new InputStreamReader(fis, "utf-8"));
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            StringBuffer sb = new StringBuffer();
            String str = null;
            try {
                while ((str = br.readLine()) != null) {
                    sb.append(str + "\n");
                }
                Toast.makeText(this, "Read from System:" + sb.toString(), 4000)
                        .show();
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void writeSystemFile() {
        FileOutputStream fos = null;
        try {
            fos = this.openFileOutput("file03.txt", Context.MODE_PRIVATE);
            // PrintWriter pw = new PrintWriter(fos);
            // pw.println("我的名字是帅哥哥");
            // pw.flush();
            try {
                fos.write("我的名字是帅哥哥,哈哈".getBytes());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Toast.makeText(this, "已写完", 4000).show();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private void readSDCardFile() {
        FileInputStream fis = null;
        BufferedReader br = null;
        try {
            fis = new FileInputStream("/mnt/sdcard/contacts.txt");
            try {
                br = new BufferedReader(new InputStreamReader(fis, "GBK"));
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            StringBuffer sb = new StringBuffer();
            String str = null;
            try {
                while ((str = br.readLine()) != null) {
                    sb.append(str + "\n");
                }
                Toast.makeText(this, "Read from SDCard:" + sb.toString(), 4000)
                        .show();
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void writeSDCardFile() {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("/mnt/sdcard/contacts.txt");
//          PrintWriter pw = new PrintWriter(fos);
//          pw.println("我的名字是帅哥哥");
//          pw.flush();
            try {
                fos.write("我的名字是帅哥哥,哈哈".getBytes());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Toast.makeText(this, "已写完", 4000).show();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

谢谢~

抱歉!评论已关闭.