在安卓应用开发中,数据存储是一个非常重要的话题。上一章我们讨论了使用 SQLite 数据库进行数据存储,本章将重点介绍另一种重要的存储方式——文件存储。文件存储适用于存储简单的文本数据、日志文件、图像等非结构化数据。
文件存储的概念
在安卓中,文件存储可以分为两种类型:内部存储和外部存储。
- 内部存储:存储在应用内部,其他应用无法访问,适合存储敏感数据。
- 外部存储:可以被其他应用访问,适合存储大量数据文件。需要注意的是,外部存储可能是可卸载的。
文件存储的基础 API
在安卓中,我们通常使用 File
和 FileOutputStream
、FileInputStream
来进行文件的读写操作。
内部存储示例
以下是一个简单的示例,演示如何在内部存储中创建和读取文件。
写入文件
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 数据库,它提供了更加灵活和便捷的数据库操作方式。希望您能继续关注下一个章节的内容。