我使用以下代码创建一些临时文件,并将tem包装为inputteam以发送到客户端。
据我所知,当磁盘空间不足时,android系统可以自动删除临时文件。
但我希望在退出应用程序时可以自行删除临时文件,我该怎么办?谢谢!
代码
File outputDir = context.getCacheDir(); // context being the Activity pointer
File outputFile = File.createTempFile("prefix", "extension", outputDir);
答案 0 :(得分:5)
调用deleteOnExit()
方法!
或
在您活动的onStop()
中调用delete()
方法。
修改强>
如果您在onDestroy()
中调用delete()
以确保您的代码能够正常工作,即使系统销毁了应用,也可能会更好。
答案 1 :(得分:5)
如果onDestroy
为isChangingConfigurations()
或false
为isFinishing
,请删除true
中的文件。例如:
@Override protected void onDestroy() {
super.onDestroy();
if(!isChangingConfigurations()) {
deleteTempFiles(getCacheDir());
}
}
private boolean deleteTempFiles(File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
deleteTempFiles(f);
} else {
f.delete();
}
}
}
}
return file.delete();
}
答案 2 :(得分:0)
首先,请记住"退出"对于Android应用程序意味着与桌面应用程序非常不同的东西。有关详细信息,请参阅this article,但简短的回答是,一般情况下,当操作系统实际关闭您的应用时,您不知道(即使它不可见)。事实上,没有明确保证操作系统会完全关闭它。
可以在这里找到一些想法(它的C#/ Xamarin.Android,但Java的确切想法):How to detect application exit on android?
除了那里列出的东西外,您还可以尝试在手机关机时注册广播接收器。
另一种(更糟糕的是,在我看来)方式是在应用程序不再可见时(在onStop
中)执行此操作。但是,如上所述,这与实际关闭的程序不同(因为您不知道 - 或者即使 - 操作系统实际上会关闭应用程序)。
答案 3 :(得分:0)
如果您可以为您创建的所有文件维护Set(避免重复),那会更好。
迭代文件列表并逐个删除每个文件。
public static final Set<String> TMP_FILES = new HashSet<>();
并通过迭代删除所有。
public void deleteTempFiles() {
for(String myTempFile: TMP_FILES) {
try {
new File(myTempFile).delete();
} catch (Exception e) {
// Handle if needed.
}
}
}
答案 4 :(得分:0)
不幸的是,您似乎必须逐个删除这些文件,方法是先将它们保存在一个数组中。
话虽如此,如果你在这个问题上检查Android开发者page,它就会使你好像可以定期删除缓存的文件&#34;并定期删除你不再需要的其他文件&# 34 ;.但是我不认为有关于如何做的解释。
答案 5 :(得分:0)
我最终在这里寻找一种方法来删除我为相机意图而创建的临时文件,实际上我使用了 Sridhar的答案和{{3 }}
我正在使用cleanOldFiles
创建一个新的图像文件,然后将其添加到
createTempFile
要使用普通的foreach循环迭代并从集合中删除,请抛出public static final HashSet<File> TEMP_FILES = new HashSet<>();
,因此我使用java.util.ConcurrentModificationException
在其他人发给我的帮助下,多亏了Sridhar和ggrandes,我想发布它,以帮助其他人。
Iterator
该功能删除以秒为单位的给定时间值之前的文件,其调用方式为
public synchronized void cleanTempFiles(final int secondsOld) {
long now = (System.currentTimeMillis() / 1000);
for (Iterator<File> iterator = TEMP_FILES.iterator(); iterator.hasNext(); ) {
File f = iterator.next();
long expired = (f.lastModified() / 1000) + secondsOld;
if (now >= expired) {
Log.d(TAG, "Deleted file - \"" + f.getAbsolutePath() +"\"");
f.delete();
iterator.remove();
}
}
}