Short Answer
You can't delete arbitrary files in Java NIO, but you can use the StandardOpenOption.DELETE_ON_CLOSE
when opening a new stream, which will delete the file as soon as the stream closes, either by calling (including from a try-with-resources statement) or the JVM terminating. For instance:.close()
Files.newOutputStream(Paths.get("Foo.tmp"), StandardOpenOption.DELETE_ON_CLOSE);
Long Answer
After a great deal of digging around, I found that Java NIO does have a way to delete on exit, but it approaches it in a different way that Java I/O.
First off, the Javadoc for Files.createTempFile()
describes three ways to delete files:
Where used as a work files [sic], the resulting file may be opened
using the DELETE_ON_CLOSE
option so that the file is deleted when the
appropriate close method is invoked. Alternatively, a shutdown-hook,
or the File.deleteOnExit()
mechanism may be used to delete the file
automatically.
The last choice, is of course a Java I/O method, which we are trying to avoid. A shutdown-hook is what is happening behind the scenes when you call the aforementioned method. But the option is pure Java NIO.File.deleteOnExit()
DELETE_ON_CLOSE
Rather than deleting arbitrary files, Java NIO assumes that you are only interested in deleting files that you are actually opening. Therefore, methods that create a new stream such as Files.newOutputStream()
can optionally take several OpenOptions
, where you can input StandardOpenOption.DELETE_ON_CLOSE
. What that does is delete the file as soon as the stream is closed (either by a call to or the JVM exiting)..close()
For instance:
Files.newOutputStream(Paths.get("Foo.tmp"), StandardOpenOption.DELETE_ON_CLOSE);
...will delete the file associated with the stream when the stream is closed, either from an explicit call to , the stream being closed as part of a try-with-resources statement, or the JVM terminating..close()
Update: On some operating systems such as Linux, deletes as soon as the OutputStream is created. If all you need is one OutputStream, that may still be okay. See DELETE_ON_CLOSE deletes files before close on Linux for more info.StandardOpenOption.DELETE_ON_CLOSE
So Java NIO adds new functionality over Java I/O in that you can delete a file when closing a stream. If that's a good enough alternative to deleting during JVM exit, you can do it in pure Java NIO. If not, you'll have to rely on Java I/O's or a shutdown-hook to delete the file.File.deleteOnExit()