17 数据存储之文件存储

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

文件存储的概念

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

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

文件存储的基础 API

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

内部存储示例

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

写入文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 方法获取内部存储的文件输出流,并将字符串数据写入其中。

读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 中添加如下权限:

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

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

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

写入外部存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();
}
}
}
}

读取外部存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 数据库,它提供了更加灵活和便捷的数据库操作方式。希望您能继续关注下一个章节的内容。

17 数据存储之文件存储

https://zglg.work/android-app-dev/17/

作者

IT教程网(郭震)

发布于

2024-08-14

更新于

2024-08-15

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论