Есть ли существующий FileInputStream delete при закрытии?

Существует ли существующий способ, чтобы FileInputStream автоматически удалял базовый файл при закрытии?

Я планировал сделать свой собственный класс утилиты для расширения FileInputStream и сделать это сам, но я удивлен, что нет уже существующего.

edit: Используйте случай, когда у меня есть действие Struts 2, которое возвращает InputStream для загрузки файла со страницы. Насколько я могу судить, я не получаю уведомление, когда действие закончено, или FileInputStream больше не используется, и я не хочу, чтобы (потенциально большие) временные файлы, которые были сгенерированы для загрузки слева лежащий вокруг.

Вопрос не касался Struts 2, поэтому я не включил эту информацию изначально и усложнил вопрос.

Ответ 1

В стандартных библиотеках нет такой вещи, а не любой из apache-commons libs, поэтому что-то вроде:

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;
         }
       }
   }
}

Ответ 2

Можете ли вы использовать File.deleteOnExit() перед открытием файла?

EDIT: вы можете подклассифицировать FileInputStream, который удалит файл в 'close()';

class MyFileInputStream extends FileInputStream
{
File file;
MyFileInputStream(File file) { super(file); this.file=file;}
public void close() { super.close(); file.delete();}
}

Ответ 3

Я знаю, что это старый вопрос, но я просто столкнулся с этой проблемой и нашел другой ответ: 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();