郭震 AI公众号:郭震AI

17 数据存储之文件存储

发布日期:

分类: 安卓开发

预计阅读: 2 分钟

阅读次数: 0

预计阅读2 分钟
结构重点5 个
图文要点0 张
正文规模794 字

在安卓应用开发中,数据存储是一个非常重要的话题。上一章我们讨论了使用 SQLite 数据库进行数据存储,本章将重点介绍另一种重要的存储方式——文件存储。文件存储适用于存储简单的文本数据、日志文件、图像等非结构化数据。

文件存储的概念

在安卓中,文件存储可以分为两种类型:内部存储和外部存储。

  • 内部存储:存储在应用内部,其他应用无法访问,适合存储敏感数据。
  • 外部存储:可以被其他应用访问,适合存储大量数据文件。需要注意的是,外部存储可能是可卸载的。

文件存储的基础 API

在安卓中,我们通常使用 FileFileOutputStreamFileInputStream 来进行文件的读写操作。

内部存储示例

以下是一个简单的示例,演示如何在内部存储中创建和读取文件。

写入文件

public void writeToFile(String fileName, String data) {
    FileOutputStream fos = null;
    try {
        // 获取内部存储的文件
        fos = openFileOutput(fileName, Context.MODE_PRIVATE);
        // 将字符串写入文件
        fos.write(data.getBytes());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在上面的代码中,我们使用 openFileOutput 方法获取内部存储的文件输出流,并将字符串数据写入其中。

读取文件

public String readFromFile(String fileName) {
    FileInputStream fis = null;
    StringBuilder stringBuilder = new StringBuilder();
    try {
        // 获取内部存储的文件
        fis = openFileInput(fileName);
        InputStreamReader inputStreamReader = new InputStreamReader(fis);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return stringBuilder.toString();
}

在这个方法中,我们同样通过 openFileInput 方法获取文件输入流,并通过 BufferedReader 逐行读取文件内容。

外部存储示例

在外部存储中,我们需要先检查权限。

申请外部存储权限

AndroidManifest.xml 中添加如下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

在代码中动态申请权限(适用于安卓6.0及以上):

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}

写入外部存储

public void writeToExternalStorage(String fileName, String data) {
    File externalDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
    File file = new File(externalDir, fileName);
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(file);
        fos.write(data.getBytes());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

读取外部存储

public String readFromExternalStorage(String fileName) {
    File externalDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
    File file = new File(externalDir, fileName);
    StringBuilder stringBuilder = new StringBuilder();
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(file);
        InputStreamReader inputStreamReader = new InputStreamReader(fis);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return stringBuilder.toString();
}

小结

通过上述内容,我们了解了在安卓中如何实现文件存储,包括内部存储和外部存储的 APIs 和用法。文件存储适合存储非结构化数据,这种方式可以与 SQLite 数据库极好地结合使用,以便根据需要选择最佳存储方式。在下一章中,我们将讨论更高级的数据库框架——Room 数据库,它提供了更加灵活和便捷的数据库操作方式。希望您能继续关注下一个章节的内容。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

继续阅读

更多相关文章推荐

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...