Android中的临时文件
前提
对于临时内部文件,它们有两个选项
1.
File file;
file = File.createTempFile(filename, null, this.getCacheDir());
2.
File file
file = new File(this.getCacheDir(), filename);
这两个选项都会在应用程序缓存目录中添加文件,因此可以根据需要清除这些文件,但选项1将在文件名的末尾添加一个随机数,以保持文件的唯一性。它还将添加一个文件扩展名,该文件扩展名为.tmp默认情况下,但可以通过使用第二参数将其设置为任何内容。使用随机数意味着,尽管指定了文件名,但它与添加的数字和后缀/文件扩展名不一样(.tmp默认情况下)例如,您将文件名指定为internal_file出来的时候internal_file1456345.tmp您可以指定扩展名,但不能指定所添加的数字。但是,您可以通过以下方式找到它生成的文件名:file.getName();,但是您需要将其存储在某个地方,以便您可以随时使用它,例如删除或读取文件。因此,由于您指定的文件名是创建的文件名,所以我更喜欢第二选项。
目前问题
在做下载功能的时候,手动创建了以”.tmp”为格式的文件作为缓存文件,待下载成功后再重命名为原文件名。出发点是没问题的,但是(经调试发现)在部分手机中出现了tmp文件被清空的问题,首先文件流的操作是没问题的,所以怀疑是文件名,命名格式不能是”.tmp”,这种格式在部分手机中大小受到限制,超过大小后文件会被清空,但是在第二次下载的时候就没这个问题了,估计是之前清空过,内存什么的都没超过阈值。
解决
1)、把”.tmp”改成了”.tmpfile”后缀
2)、血与痛的教训,在改成”.tmpfile”后缀,在三星S8再次重现。处于好奇,直接把文件命名为文件名 + 时间戳 + “.zip”,暂时没重现。
3)、看了流利说的下载源码,其内部使用了RandomAccessFile+FileDescriptor+的方式。要点1、写入之前先确定文件大小randomAccess.setLength(totalBytes); 2、每次写入后都bos.flush(); 3、flush之后立即fd.sync();