2011-01-14 12 views
19

Czy istnieje sposób na usunięcie pliku podstawowego automatycznie po zamknięciu?czy istnieje istniejący błąd FileInputStream przy zamknięciu?

Planowałem stworzyć własną klasę użytkową, aby rozszerzyć FileInputStream i zrobić to sam, ale jestem trochę zaskoczony, że nie ma czegoś już istniejącego.

edit: przypadków użycia jest to, że mam Struts 2 Akcja, która zwraca InputStream do pobierania plików ze strony. O ile mogę powiedzieć, nie otrzymuję powiadomienia, gdy akcja się zakończyła, lub FileInputStream nie jest już używana i nie chcę, aby (potencjalnie duże) pliki tymczasowe, które zostały wygenerowane do pobrania, leżą w pobliżu .

Pytanie nie dotyczyło Struts 2, więc początkowo nie dodawałem tych informacji i nie komplikowałem pytania.

+0

co to use-case do tego? – skaffman

+2

@skaffman raczej oczywiste, po przeczytaniu pliku chce go usunąć (James Bond-Style, Taśma sam się zniszczy po tej wiadomości) –

+1

@Sean: To nie jest przypadek. Przypadkiem użycia jest to, co właśnie dodał do pytania. – skaffman

Odpowiedz

25

Nie ma czegoś takiego w standardowych bibliotekach, a nie któregokolwiek z Apache commons bibliotekami albo, więc coś takiego:

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

Po usunięciu pliku powinienem usunąć wartość null, aby być czystym w przypadku, gdy zamknięcie jest wywoływane więcej niż jeden raz. –

+0

Dzięki. Planowałem napisać własne, ale byłem zaskoczony, że w standardowych bibliotekach nie ma nic. Nie sprawdziłem wspólnych commów Apache. –

6

Czy przed otwarciem pliku można użyć File.deleteOnExit()?

EDYTOWANIE: Możesz podklasować FileInputStream, który usunie plik na 'close()';

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

"File.createTempFile" może być również przydatny. Wygląda na to, że Shawn D potrzebuje tymczasowego pliku. – Stas

+1

Nie, nie mogę, ponieważ jest to aplikacja długotrwała. –

3

wiem, jest to stara sprawa, ale ja po prostu zabrakło w tym wydaniu i znalazłem inną odpowiedź: javax.ws.rs.core.StreamingOutput.

Oto jak użyłem go:

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(); 
+0

To jest świetne i wygląda jak typ klasy, która miała zająć się powracającymi plikami tymczasowymi za pomocą żądania internetowego! –

Powiązane problemy