Jupyter AI

17 数据存储之文件存储

📅 发表日期: 2024年8月15日

分类: 📱安卓应用开发

👁️阅读: --

在安卓应用开发中,数据存储是一个非常重要的话题。上一章我们讨论了使用 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 数据库,它提供了更加灵活和便捷的数据库操作方式。希望您能继续关注下一个章节的内容。