существует ли существующее удаление FileInputStream при закрытии? - PullRequest
20 голосов
/ 14 января 2011

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

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

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

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

Ответы [ 4 ]

28 голосов
/ 14 января 2011

В стандартных библиотеках такого нет, и нет ни одной из библиотек 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;
         }
       }
   }
}
8 голосов
/ 11 октября 2018

Я знаю, что это довольно старый вопрос; однако это один из первых результатов в Google, и в Java 7+ встроена эта функциональность:

Path path = Paths.get(filePath);
InputStream fileStream = Files.newInputStream(path, StandardOpenOption.DELETE_ON_CLOSE);

Есть несколько предостережений с этим подходом, они записаны здесь , но суть в том, что реализация делает все возможное, чтобы удалить файл, когда входной поток закрыт, и если это не удается, сделайте еще одну лучшую попытку, когда JVM завершит работу. Он предназначен для использования с временными файлами, которые используются только одним экземпляром JVM. Если приложение чувствительно к безопасности, есть также несколько других предостережений.

6 голосов
/ 14 января 2011

Можно ли использовать 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();}
}
3 голосов
/ 28 сентября 2013

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