Android开发Android知识Android开发经验谈

持久化技术--文件存储

2016-05-10  本文已影响79人  大话程序

持久化技术--文件存储

文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何格式化的处理,所有的数据都是原封不动的存储到文件中,因而适合存储一些简单的文本数据或者二进制数据

文件存储的核心技术:使用Context类中提供的openFileInput()openFileOutput()方法

将文件存储到文件中

使用文件存储,存储的默认路径为(且不能更改):/data/data/<packageName>/files/目录下

文件的操作模式,主要有两种模式可以选择:MODE_PRIVATE(默认的操作模式):表示当指定同样文件名的时候,所写的内容将会覆盖原文件中的内容;MODE_APPEND:表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件

指定的文件名不可以包含路径

代码如下:

/**当活动销毁的时候,将界面上的文本框内的内容利用文件存储技术存储到文件中*/
public class MainActivity extends Activity {
    
    private EditText edit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //假设界面上有一个输入文本框
        edit = (EditText) findViewById(R.id.edit);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String inputText = edit.getText().toString();
        save(inputText);
    }

    public void save(String inputText) {
        BufferedWriter writer = null;
        try {
            //通过Context类的openFileOutput方法拿到文件的输出字节流,将此字节流包装为带缓冲区的字符输出流
            writer = new BufferedWriter(new OutputStreamWriter(openFileOutput("data", Context.MODE_PRIVATE)));
            writer.write(inputText);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
}

从文件中读取数据

使用文件存储功能取出数据,默认的路径(不可更改)是/data/data/<packageName>/files/

更改以上代码:(在onCreate()中增加代码并增加一个成员方法):

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit = (EditText) findViewById(R.id.edit);
        String inputText = load();
        //使用TextUtils类的isEmpty方法进行双重判断,文本内容为null或者为空字符串则返回true
        if (!TextUtils.isEmpty(inputText)) {
            edit.setText(inputText);
            //将光标移到文本最后
            edit.setSelection(inputText.length());
            Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
        }
    }

    public String load() {
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            //通过Context类的openFileInput()方法获得文件输入字节流,通过包装得到带缓冲区的字符串输入流
            reader = new BufferedReader(new InputStreamReader(openFileInput("data")));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }

使用API获取内存存储路径

当内部存储空间存储不足时,cache文件夹下的文件会被删除

使用API获取外部存储路径(sd卡真实路径)

使用API获取外部存储的状态

使用Environment.getExternalStorageState()获取状态,常见状态:

使用API获取外部存储设备的容量

存储设备都是分块的

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取外部存储空间路径
        File path = Environment.getExternalStorageDirectory();
              //创建StatFs对象,此对象可获得存储信息
        StatFs stat = new StatFs(path.getPath());
        
        long blockSize;
        long availableBlocks;

        //判断当期系统使用的版本号
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
            //这两个方法只有在 API level 18及以上才可以使用
                       //获得存储设备分块大小
            blockSize = stat.getBlockSizeLong();
                       //获得存储设备可用分块数量
            availableBlocks = stat.getAvailableBlocksLong();
        }else {
            blockSize = stat.getBlockSize();
            availableBlocks = stat.getAvailableBlocks();
        }

        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(formatSize(availableBlocks * blockSize));
        
    }
        //将存储设备可用大小转换成合适的单位
    private String formatSize(long size){
        return Formatter.formatFileSize(this, size);
    }

}
上一篇下一篇

猜你喜欢

热点阅读