Delete temporary files created by Tar on close

The SwapJob creates temporary files indirectly through Tar.bz2.zip.
These files are deleted with File.deleteOnExit, but there is no other
deletion mechanism.  This means that temporary files will build up as
the git bridge runs, only being deleted when the JVM finally
terminates.

Instead, we can delete these temporary files as soon as they are no
longer needed.  The files are wrapped in a FileInputStream and not
directly exposed, so we can simply delete the underlying file when the
stream is closed, as then the file is inaccessible.
This commit is contained in:
Michael Walker 2017-07-14 10:37:50 +01:00
parent 0d2a33be14
commit ced34d91d4
2 changed files with 42 additions and 1 deletions

View file

@ -0,0 +1,41 @@
package uk.ac.ic.wlgitbridge.util;
import java.io.*;
/**
* A {@link java.io.FileInputStream} which deletes the underlying
* {@link java.io.File} on close.
*
* @author Michael Walker (barrucadu) {@literal <mike@barrucadu.co.uk>}
*/
public class DeletingFileInputStream extends FileInputStream {
private File file;
/**
* Creates a {@link java.io.FileInputStream} by opening a
* connection to an actual file, the file named by the
* {@link java.io.File} object file in the file system.
*
* When the {@link close} method is called, the {@code File} will
* be deleted.
*/
public DeletingFileInputStream(File file) throws FileNotFoundException {
super(file);
this.file = file;
}
/**
* Closes this input stream and deletes the underlying file.
*/
@Override
public void close() throws IOException {
try {
super.close();
} finally {
if(file != null) {
file.delete();
file = null;
}
}
}
}

View file

@ -46,7 +46,7 @@ public class Tar {
if (sizePtr != null) { if (sizePtr != null) {
sizePtr[0] = tmp.length(); sizePtr[0] = tmp.length();
} }
return new FileInputStream(tmp); return new DeletingFileInputStream(tmp);
} }
public static void unzip( public static void unzip(