应用程序内部存储:是什么、数据存储方式及在开发中的工作原理

作者: IT Sectr 发布日期: 2026-03-13 阅读时间: 11 分钟

应用程序内部存储是设备上的一块专用空间,只能通过隔离存储供特定应用程序访问。根据 Android Developers, 2026,每个应用程序都拥有自己的沙盒目录,其他应用程序无法直接访问。这种方法可以保护数据免遭未经授权的读取,并确保在移动设备的多任务环境中稳定运行。

要点

  • Internal Storage — 每个应用程序的隔离存储,其他程序无法访问
  • 沙盒模型确保一个应用程序的数据未经特殊许可不能被其他程序读取
  • Android 提供 Context.getFilesDir()getCacheDir()getDataDir() 用于访问内部存储
  • iOS 在应用程序的沙盒容器中使用 NSDocumentDirectoryNSCachesDirectory
  • 自动清理 — 卸载应用程序时确保内部存储中的所有数据被完全删除

什么是应用程序内部存储?

应用程序内部存储是操作系统在安装时分配给每个应用程序的隔离目录。其他应用程序和用户无法通过标准文件管理器访问此目录。系统确保卸载应用程序时此目录中的数据将被完全删除。这种方法构成了移动操作系统安全模型的基础,防止机密信息在程序之间泄露。

与外部存储(SD卡)不同,内部存储始终可用,无需检查介质是否存在。现代设备NAND闪存的读写速度达到顺序读取800–900 MB/s和顺序写入200–300 MB/s,与SATA SSD相当。分配区域的大小取决于设备的总体容量和制造商策略:在64 GB闪存设备上,应用程序获得16–64 MB的初始空间,并可根据需要扩展。

内部存储架构在Android和iOS上有所不同。在Android上,每个应用程序获得/data/data/<package_name>/目录,系统在其中创建files/cache/databases/子目录。在iOS上,应用程序在沙盒容器中运行,包含Documents/Library/tmp/目录,每个目录都有各自的用途和备份策略。

内部存储的数据存储方式

开发人员可以使用多种方法在应用程序内部存储中保存数据。每种方法解决特定任务,适用于特定数据类型。选择正确的方法直接影响应用程序性能、开发便利性和用户数据安全性。

隔离文件存储

最底层的方法是直接写入files目录中的文件。应用程序可以在其沙盒内创建任何文件和目录。此方法适用于存储媒体文件、用户文档和任何不需要结构化组织的二进制数据。在Android上,通过调用Context.getFilesDir()访问该目录,该方法返回应用程序文件目录的绝对路径。在iOS上,NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)执行类似功能。

SharedPreferences 和 DataStore

对于键值对存储,Android提供SharedPreferences和更现代的基于Kotlin协程和protobuf协议的DataStore。SharedPreferences将数据存储在/data/data/<package>/shared_prefs/目录的XML文件中。尽管使用简单,SharedPreferences有缺点:同步写入可能导致UI线程延迟,缺乏类型安全性增加错误风险。DataStore通过提供基于Flow的异步API和通过protobuf模式的完整类型支持解决了这些问题。

SQLite数据库和Room

对于具有关系型关联的结构化数据,最佳选择是SQLite或Room封装库。数据库存储在databases/目录的单个文件中,支持完整SQL语法。Room是官方Jetpack库,提供类型安全API、自动模式迁移和协程支持。在正确索引的情况下,数据库大小可达数GB而不会显著损失性能。SQLite在现代旗舰级处理器上的移动设备上每秒可处理多达50,000次写入操作。

EncryptedSharedPreferences

对于存储敏感数据(如身份验证令牌和加密密钥),Android提供EncryptedSharedPreferences。这个标准SharedPreferences的封装库使用AES256-GCM-None自动加密键和值。加密在写入磁盘之前在文件级别执行,因此即使攻击者物理访问设备也无法读取内容。EncryptedSharedPreferences是AndroidX Security库的一部分,该库还包括用于加密整个文件的EncryptedFile。

如何在 Android 中使用内部存储

Android SDK通过Context类提供了一组用于内部存储的方法。每个方法返回应用程序沙盒内特定系统目录的路径。让我们通过Kotlin示例了解基本的文件写入和读取操作。

通过Context访问filesDir

获取内部文件目录路径的主要方法是context.filesDir。它返回指向/data/data/<package>/files/目录的File对象。首次调用时,系统自动创建所有必要的父目录。内部存储中的文件大小没有明确限制,但总数据量不应超过/data分区的可用空间,该分区通常占设备闪存总容量的60–80%。

kotlin
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")

file.writeText("笔记内容")

val content = file.readText()
println("已阅读:$content")

writeText和readText方法是Kotlin标准库的扩展函数。它们自动管理流的打开和关闭,从而避免内存泄漏。对于二进制数据,使用writeBytesreadBytes,它们不需要编码,使用ByteArray数组工作。处理大文件时,建议使用缓冲流:文本使用BufferedReaderBufferedWriter,二进制数据使用BufferedInputStreamBufferedOutputStream

在内部存储中创建子目录

为了将文件组织成层次结构,请在filesDir内创建子目录。这有助于按类型组织数据:图片、文档、导出文件。mkdirs()方法创建路径中所有缺失的目录(包括嵌套目录)。确保创建操作成功——该方法仅在新目录创建时返回true。创建失败通常与/data分区空间不足或文件系统inode耗尽有关。

kotlin
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
    println("目录已创建")
}

val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)

写入大文件之前检查可用空间,使用File.getFreeSpace()File.getUsableSpace()。第二个方法返回当前应用程序可用的字节数(考虑安全配额),在多用户设备上更准确。如果可用空间小于预期文件大小,请向用户显示消息并建议在设备设置中释放空间。

如何在 iOS 中使用内部存储

在iOS上,每个应用程序运行在隔离的沙盒容器中。系统不提供在无特殊权限的情况下离开其边界的API。用于文件系统的主要工具是Foundation框架中的FileManager类。沙盒容器包含多个标准目录,每个目录都有自己的备份策略。

通过FileManager访问Documents目录

Documents目录用于用户数据,这些数据应在应用程序启动之间保留并从备份中恢复。iOS自动将此目录包含在iCloud和iTunes备份中。urls(for:in:)方法返回请求目录的URL数组——数组的第一个元素是主目录。

swift
let fm = FileManager.default
let docs = fm.urls(
    for: .documentDirectory,
    in: .userDomainMask
).first!

let fileURL = docs.appendingPathComponent("data.plist")
try data.write(to: fileURL)

FileManager支持完整的文件操作集:创建、复制、移动、删除和重命名。每个操作都可能抛出错误,因此所有调用必须包装在do-catch结构中。特别注意文件删除——该操作不可逆,在removeItem(at:)之后没有预先备份就无法恢复数据。

管理备份例外

并非沙盒容器中的所有数据都应包含在iCloud备份中。例如,下载的图片缓存或临时处理文件不需要恢复——它们将在下次使用时重新创建。要从备份中排除目录或文件,将isExcludedFromBackup属性设置为true。Apple建议始终从备份中排除可以远程恢复的数据,以最小化iCloud存储空间并缩短恢复时间。

swift
var cacheURL = fm.urls(
    for: .cachesDirectory,
    in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true

var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)

内部存储、缓存和外部存储的区别

移动设备上的每种存储类型都有其用途和使用规则。理解这些差异有助于开发人员为每种数据类型选择正确的位置。以下是对应用程序可用的三种主要存储类型的比较。

特性Internal StorageCache DirectoryExternal Storage
其他应用程序可见性隐藏隐藏可访问
卸载应用程序时删除完全完全取决于位置
备份Android — 否,iOS — 是 (Documents)仅同步时
无需介质的可用性始终始终需要SD卡
数据丢失风险最低中等
推荐文件大小可达100 MB可达50 MB任意

内部存储最适合存储应用程序配置、数据库文件和不应被其他程序访问的用户文档。缓存目录用于可在下次使用时重新创建的临时文件:下载的图片、API响应、中间处理数据。外部存储最适合大型媒体文件(照片、视频、音乐)和用户希望通过共享访问与其他应用程序共享的数据。

存储类型的选择也影响应用程序在Google Play和App Store中的评分。将大量数据存储在内部存储中而不清理的应用程序会收到负面评价:用户抱怨空间不足。根据App Annie的研究,62%的用户会在应用程序占用超过500 MB内部存储空间且没有清理选项时删除它。

内部存储使用建议

正确管理应用程序内部存储可提高性能、安全性和用户体验。以下建议基于Android和iOS官方文档以及数百万安装量应用程序的实际开发经验。

  • 最小化存储数据量。仅将内部存储用于关键文件,其余放在缓存或外部存储中
  • 定期清理临时文件。每次启动时检查cache目录并删除超过24小时的文件——这可以减轻系统负载并防止/data分区溢出
  • 加密敏感数据使用AndroidX Security库的EncryptedSharedPreferences或EncryptedFile。以明文形式存储令牌和密码是常见漏洞,会被具有root权限的木马利用
  • 使用迁移更新文件结构。发布新版本应用程序时,检查旧文件是否存在并在删除旧文件前将其移至新目录

特别关注边界情况测试。测试应用程序在内部存储溢出、写入中断(应用程序崩溃、来电)以及从iOS备份恢复时的行为。在每种场景下,数据应保持一致性或恢复到最后一个稳定状态。使用事务文件:将数据写入临时文件,然后原子性地重命名为目标文件。这可以防止写入失败时读取损坏的数据。

不要忘记用户控制。在应用程序设置中提供清理临时数据和显示已用内部存储容量的选项。根据Google Play Console的数据,具有此功能的应用程序在“性能”类别中获得的正面评价多出18%。

常见问题解答

卸载应用程序后Internal Storage会发生什么?

来自应用程序内部存储的所有数据将被完全删除。操作系统确保没有残留文件,包括数据库、设置和临时文件。外部存储上的数据可能保留。

其他应用程序可以读取我Internal Storage中的文件吗?

在没有root权限的情况下,其他应用程序无法读取另一应用程序的Internal Storage中的文件。在Android上需要超级用户权限,在iOS上通过沙盒在内核级别实现隔离。

内部存储中可以存储的最大数据量是多少?

没有明确限制,但总量受/data分区可用空间限制。建议每个应用程序不超过100 MB——更大的数据量应放在外部存储或云端。

Android上filesDir和cacheDir有什么区别?

filesDir用于应用程序的持久数据,系统不会无故删除。cacheDir用于临时文件,系统在内存不足时可以删除。系统不保证cacheDir的保存。

如何将数据从Internal Storage传输到SD卡?

安全策略禁止直接从Internal Storage复制到SD卡。使用Android 10+上的MediaStore API或SAF(存储访问框架)在用户同意的情况下在共享存储中创建数据副本。

总结

  • Internal Storage — 每个应用程序的隔离目录,受保护免受其他程序和用户访问
  • 沙盒架构在Android和iOS上确保不同应用程序的数据不重叠,未经root权限无法读取
  • 存储方式的选择取决于数据类型:文件——通过filesDir,设置——通过DataStore,结构化数据——通过Room
  • iOS沙盒包含备份策略,需要通过isExcludedFromBackup属性对非关键数据进行控制
  • 与缓存的不同在于保存保证:Internal Storage不会被系统删除,而cacheDir在内存不足时可能被清除
  • 推荐数据量在内部存储中不超过100 MB。更大的文件应放在外部存储或云服务中
  • 用户对已用空间的控制和清除数据的能力提高信任度和应用商店评分

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读