Существует ли существующее удаление FileInputStream при закрытии?
Есть ли существующий способ иметь FileInputStream
удалить базовый файл автоматически при закрытии?
Я планировал сделать свой собственный служебный класс, чтобы расширить FileInputStream
и делаю это сам, но я немного удивлен, что чего-то уже не существует.
редактировать: вариант использования заключается в том, что у меня есть действие Struts 2, которое возвращает InputStream
для скачивания файла со страницы. Насколько я могу судить, я не получаю уведомление о завершении действия или FileInputStream
больше не используется, и я не хочу, чтобы (потенциально большие) временные файлы, которые были сгенерированы, были загружены и лежали без дела.
Вопрос не был специфичным для Struts 2, поэтому я изначально не включил эту информацию и не усложнил вопрос.
4 ответа
В стандартных библиотеках такого нет, и нет никаких библиотек apache-commons, так что-то вроде:
public class DeleteOnCloseFileInputStream extends FileInputStream {
private File file;
public DeleteOnCloseFileInputStream(String fileName) throws FileNotFoundException{
this(new File(fileName));
}
public DeleteOnCloseFileInputStream(File file) throws FileNotFoundException{
super(file);
this.file = file;
}
public void close() throws IOException {
try {
super.close();
} finally {
if(file != null) {
file.delete();
file = null;
}
}
}
}
Я знаю, что это довольно старый вопрос; однако это один из первых результатов в Google, и в Java 7+ встроена эта функциональность:
Path path = Paths.get(filePath);
InputStream fileStream = Files.newInputStream(path, StandardOpenOption.DELETE_ON_CLOSE);
Есть несколько предостережений с этим подходом, они написаны здесь, но суть в том, что реализация делает все возможное, чтобы удалить файл, когда входной поток закрыт, и, если это не удается, делает еще одну попытку, когда JVM завершается. Он предназначен для использования с временными файлами, которые используются только одним экземпляром JVM. Если приложение чувствительно к безопасности, есть также несколько других предостережений.
Можно ли использовать File.deleteOnExit() перед открытием файла?
РЕДАКТИРОВАТЬ: Вы можете создать подкласс FileInputStream, который удалит файл в 'close()';
class MyFileInputStream extends FileInputStream
{
File file;
MyFileInputStream(File file) { super(file); this.file=file;}
public void close() { super.close(); file.delete();}
}
Я знаю, что это старый вопрос, но я столкнулся с этой проблемой и нашел другой ответ: javax.ws.rs.core.StreamingOutput.
Вот как я это использовал:
File downloadFile = ...figure out what file to download...
StreamingOutput so = new StreamingOutput(){
public void write(OutputStream os) throws IOException {
FileUtils.copyFile(downloadFile, os);
downloadFile.delete();
}
ResponseBuilder response = Response.ok(so, mimeType);
response.header("Content-Disposition", "attachment; filename=\""+downloadFile.getName()+"\"");
result = response.build();