在写入内部存储之前检查存储是否已满

Checking if the storage is full before writing to internal storage

我使用内部数据(应用程序的私有数据)来保存数据。

但是,如果设备存储空间不足,如何在保存前检查存储空间是否已满?如果写入文件的数据非常大,导致设备存储空间变满,我该如何检查并通知 user/prevent 应用程序显示强制关闭对话框?

Android 系统是否针对此问题采取了任何措施(例如,显示一条消息告诉用户设备上没有更多 space)?

主要关注的是确保在适用的驱动器上进行检查;如果应用程序已移动到 SD 卡或其他外部存储单元,则应根据剩余内存检查该驱动器

示例场景:设备还剩 238KB。有 10 个文件保存数据。每个文件为 30-40KB。假设平均值为 35KB/文件,则可以写入 6 个文件,而最后 4 个则不能。我该如何处理此类问题?

how can I check if the memory is full before saving?

Use StatFs 找出可用磁盘的数量 space,给出您感兴趣的分区上某个位置的路径。

Does the Android system do anything on this issue(e.g. show a message that tells the user there isn't more space on the device)?

据我所知,它不会实时这样做。 IOW,用户可能会不时收到有关他们的设备在 space 上开始变低的通知,但这些消息的时间与您的应用程序的 运行 没有任何关系。这是一个设备范围的警告,而不是 "OMG that app is about to write a file!" 警告。

您问了几个问题,但您需要做的只是简单检查一下是否有可用的存储内存,然后再进行任何文件写入操作。

您可以使用此实用程序方法快速检查设备上的可用存储空间 space,

 public static long getAvailableInternalMemorySize() {
        File path = Environment.getDataDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize, availableBlocks;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            blockSize = stat.getBlockSizeLong();
            availableBlocks = stat.getAvailableBlocksLong();
        } else {
            blockSize = stat.getBlockSize();
            availableBlocks = stat.getAvailableBlocks();
        }
        return availableBlocks * blockSize;
    }

如您所知,您可以使用文件的 length() 方法获取文件的大小。它会 return 你每个文件的大小(以字节为单位)。

您只需将要写入的文件大小与可用存储空间进行比较即可。如果您的文件大小小于可用的总存储空间,您可以继续写入文件。