Существует ли существующее удаление 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();
Другие вопросы по тегам