2011-01-14 3 views
19

Esiste un modo per fare in modo che FileInputStream elimini automaticamente il file sottostante quando viene chiuso?esiste una eliminazione FileInputStream esistente alla chiusura?

Stavo progettando di rendere la mia classe di utilità estendere FileInputStream e farlo da solo, ma sono piuttosto sorpresa che non ci sia qualcosa già esistente.

modifica: Il caso di utilizzo è che ho un'azione di Struts 2 che restituisce un InputStream per il download di file da una pagina. Per quanto posso dire, non ricevo la notifica quando l'azione è finita, o il FileInputStream non è più in uso, e non voglio che i file temporanei (potenzialmente grandi) che vengono generati per essere scaricati lasciati in giro .

La domanda non era specifica per Struts 2, quindi non ho incluso quelle informazioni in origine e complicato la domanda.

+0

qual è il caso d'uso per questo? – skaffman

+2

@skaffman piuttosto ovvio, dopo aver letto il file che desidera eliminare (James Bond-Style, questo nastro si autodistruggerà dopo questo messaggio) –

+1

@Sean: Questo non è un caso d'uso. Un caso d'uso è ciò che ha appena aggiunto alla domanda. – skaffman

risposta

25

Non c'è nulla di simile nelle librerie standard, e non uno qualsiasi dei apache-commons librerie o, in modo qualcosa di simile:

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

Annullo il file dopo averlo eliminato in chiusura, per essere pulito nel caso in cui la chiusura venga chiamata più di una volta. –

+0

Grazie. Avevo programmato di scrivere il mio, ma ero semplicemente sorpreso che non ci fosse nulla nelle librerie standard. Non avevo controllato i comuni di Apache. –

6

È possibile utilizzare File.deleteOnExit() prima di aprire il file?

EDIT: su è possibile creare una sottoclasse di FileInputStream che eliminerà il file su "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" può anche essere utile. Sembra che Shawn D abbia bisogno di un file temporaneo. – Stas

+1

No, non posso, poiché è un'applicazione che funziona da molto tempo. –

3

So che questa è una vecchia questione, ma ho appena eseguito in questo problema, e ha trovato un'altra risposta: javax.ws.rs.core.StreamingOutput.

Ecco come l'ho usato:

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

Questo è eccezionale e assomiglia al tipo di classe che intendeva trattare i file temporanei di ritorno usando una richiesta web! –