问题
In my app I'm writing a file to store some execution info and once the execution is done I want to delete the temp file. The issue is even after file close or flush by streams I cannot delete the file. I tried
Thread.sleep(1000);
file.delete();
and that didn't delete the file either. I then created a while loop
while(!file.delete())
Thread.sleep(1000);
and it was looping forever. I then added
System.gc();
file.delete();
and it worked!!!
I have verified that I have gracefully closed or flushed the file. I want to know why my code worked with System.gc()
?
回答1:
That seems to indicate that you did not call close()
.
Reason: in the begin time of java, the Object.finalize()
method was used to clean up on garbage collection, and for I/O it did a close()
.
Until the file is in use (not closed), the file cannot be deleted on Windows.
回答2:
What you want to use is File.createTempFile() and call deleteOnExit()
on the resulting file. It will manage cleaning up the temp file at the end of execution for you. You shouldn't be doing this manually, let the system do this for you, that is why they included this in the standard library.
Also you should always call .close()
to make sure that all the data is flushed to the file and the handle can be cleaned up correctly.
来源:https://stackoverflow.com/questions/9398746/java-file-delete-and-system-gc