博客
关于我
Android存储之——文件存储
阅读量:94 次
发布时间:2019-02-26

本文共 6145 字,大约阅读时间需要 20 分钟。

Android应用中常需要将程序数据持久化存储,openFileOutput()方法提供了一种简单的方式来创建或打开文件进行写入操作。本文将详细讲解如何使用此方法,包括文件存储的注意事项以及读取存储内容的实现方法。

1. openFileOutput()方法的使用

1.1 方法概述

openFileOutput()方法用于在应用的默认文件目录下创建或打开文件进行写入操作。该方法的主要用途是将程序数据持久化存储,如用户输入、偏好设置等。

1.2 方法参数

  • 参数一:文件名

    文件名应为简单的文字名称,不包含路径分隔符(如"/")。系统会自动生成存储路径:data/data/
    /files/。例如,文件itcast.txt将存储在/data/data/cn.itcast.action/files/itcast.txt。

  • 参数二:操作模式

    操作模式决定文件的访问权限和写入行为。常用模式包括:

    • Context.MODE_PRIVATE(0):默认模式,文件仅供应用内部使用,写入时会覆盖现有文件。
    • Context.MODE_APPEND(32768):若文件已存在,则内容追加到末尾;若不存在,则创建新文件。
    • Context.MODE_WORLD_READABLE(1):允许其他应用读取文件。
    • Context.MODE_WORLD_WRITEABLE(2):允许其他应用写入文件。

    建议在开发中尽量使用默认模式(MODE_PRIVATE),以确保文件的安全性。若需要其他应用访问文件,则需明确指定相应的模式。

1.3 文件存储路径

文件将被存储在以下路径下:data/data/

/files/。开发者可通过Eclipse菜单“Window”-“Show View”-“Other”选择“File Explorer”视图,查看具体存储位置。

2. 保存文件的实现示例

2.1 XML布局文件

2.2 主Activity代码

package org.day13_filesave;import java.io.BufferedReader;import java.io BufferedWriter;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.Menu;import android.widget.EditText;public class MainActivity extends Activity {    private EditText editText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.editText);    }    @Override    protected void onDestroy() {        super.onDestroy();        String data = editText.getText().toString();        save(data, "fileName.txt");    }    public void save(String data, String name) {        FileOutputStream fos = null;        BufferedWriter bw = null;        try {            fos = openFileOutput(name, Context.MODE_PRIVATE);            bw = new BufferedWriter(new OutputStreamWriter(fos));            bw.write(data);            bw.flush();        } catch (Exception e) {            e.printStackTrace();        } finally {            if (bw != null) {                try {                    bw.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}

3. 读取文件的实现

为了实现读取存储内容的功能,需使用openFileInput()方法,它返回FileInputStream对象,用于读取文件内容。

3.1 openFileInput()方法的使用

openFileInput()方法与openFileOutput()类似,用于打开文件进行读取操作。其参数仅文件名,系统自动生成存储路径。

3.2 读取文件内容的实现示例

public String load(String fileName) {    FileInputStream fis = null;    BufferedReader br = null;    StringBuilder content = new StringBuilder();    try {        fis = openFileInput(fileName);        br = new BufferedReader(new InputStreamReader(fis));        String line = "";        while ((line = br.readLine()) != null) {            content.append(line);        }        return content.toString();    } catch (Exception e) {        e.printStackTrace();    } finally {        if (br != null) {            try {                br.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }    return null;}

4. 实现恢复上次输入内容

在上述基础上,可以通过读取存储文件内容,将其恢复到EditText中,提升用户体验。

4.1 修改initViews方法

private void initViews() {    editText = (EditText) findViewById(R.id.editText);    String inputText = load("fileName.txt");    if (!TextUtils.isEmpty(inputText)) {        editText.setText(inputText);        editText.setSelection(inputText.length());        Toast.makeText(this, "恢复数据成功!", 0).show();    }}

4.2 完整代码

package org.day13_filesave;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io OutputStreamWriter;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.text.TextUtils;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {    private EditText editText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViews();    }    private void initViews() {        editText = (EditText) findViewById(R.id.editText);        String inputText = load("fileName.txt");        if (!TextUtils.isEmpty(inputText)) {            editText.setText(inputText);            editText.setSelection(inputText.length());            Toast.makeText(this, "恢复数据成功!", 0).show();        }    }    @Override    protected void onDestroy() {        super.onDestroy();        String data = editText.getText().toString();        save(data, "fileName.txt");    }    public void save(String data, String name) {        FileOutputStream fos = null;        BufferedWriter bw = null;        try {            fos = openFileOutput(name, Context.MODE_PRIVATE);            bw = new BufferedWriter(new OutputStreamWriter(fos));            bw.write(data);            bw.flush();        } catch (Exception e) {            e.printStackTrace();        } finally {            if (bw != null) {                try {                    bw.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    public String load(String fileName) {        FileInputStream fis = null;        BufferedReader br = null;        StringBuilder content = new StringBuilder();        try {            fis = openFileInput(fileName);            br = new BufferedReader(new InputStreamReader(fis));            String line = "";            while ((line = br.readLine()) != null) {                content.append(line);            }            return content.toString();        } catch (Exception e) {            e.printStackTrace();        } finally {            if (br != null) {                try {                    br.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return null;    }}

5. 注意事项

  • 文件安全:默认存储路径为data/data/
    /files/,文件权限设置为私有,其他应用无法访问。
  • 文件名规范:文件名不应包含路径分隔符,避免存储时出现问题。
  • 读取与写入顺序:确保在读取文件前检查文件存在,避免NullPointer异常。

通过以上方法,开发者可以方便地在Android应用中实现文件的存储与读取,提升用户体验。

转载地址:http://nrvk.baihongyu.com/

你可能感兴趣的文章
OSG学习:纹理映射(四)——三维纹理映射
查看>>
OSPF 四种设备角色:IR、ABR、BR、ASBR
查看>>
SQL Server 存储过程分页。
查看>>
OSPF不能发现其他区域路由时,该怎么办?
查看>>
OSPF两个版本:OSPFv3与OSPFv2到底有啥区别?
查看>>
SQL Server 存储过程
查看>>
OSPF在大型网络中的应用:高效路由与可扩展性
查看>>
OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
查看>>
OSPF技术连载17:优化OSPF网络性能利器——被动接口!
查看>>
OSPF技术连载18:OSPF网络类型:非广播、广播、点对多点、点对多点非广播、点对点
查看>>
OSPF技术连载19:深入解析OSPF特殊区域
查看>>
SQL Server 复制 订阅与发布
查看>>
OSPF技术连载20:OSPF 十大LSA类型,太详细了!
查看>>
OSPF技术连载21:OSPF虚链路,现代网络逻辑连接的利器!
查看>>
OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
查看>>
OSPRay 开源项目教程
查看>>
Padding
查看>>
paddlehub安装及对口罩检测
查看>>
paddle的两阶段基础算法基础
查看>>
Page Object模式:为什么它是Web自动化测试的必备工具
查看>>