2014-07-15 17 views
10

Ich habe ein paar Dateien für die temporäre Verwendung erstellt und sie als Eingaben für einige Methoden verwendet. Und ich riefdeleteOnExit löscht die Datei nicht

deleteOnExit() 

auf alle Dateien, die ich erstellte. Aber eine Datei bleibt noch.

Ich nehme an, es liegt daran, dass die Datei noch in Gebrauch ist, aber nicht der Compiler zur nächsten Zeile geht erst nach der aktuellen Zeile erfolgt? (Single-Thread)

Während seines kein Problem praktisch wegen Java überschreibt, es gibt immer nur eine Datei. Ich möchte verstehen, warum es passiert, und auch wenn ich

Thread.sleep(sometime); 

bearbeiten können: -

File x = new file("x.txt"); 
new class1().method1(); 

Nachdem alle Dateien zu erstellen (5), habe ich nur noch diese Zeile

x.deleteOnExit(); y.deletOnExit() and so on... 

Alle Dateien außer der letzten werden gelöscht.

+2

Sie wollen, um Ihren Code anzuhängen. Das Problem könnte darin liegen. –

+0

Haben Sie Ihren Java-Prozess tatsächlich beendet? –

+0

Eine mögliche bessere Methode, um dies zu umgehen, ist die Verwendung von Finalizern ... –

Antwort

14

Achten Sie darauf, dass das, was Strom in die Datei schreiben, geschlossen sind. Wenn der Stream nicht geschlossen ist, wird die Datei gesperrt und delete gibt false zurück. Das war ein Problem, das ich hatte. Hoffentlich hilft das.

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.StringWriter; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 


public class Test { 

    public static void main(String[] args) { 

     File reportNew = null; 
     File writeToDir = null; 

     BufferedReader br = null; 
     BufferedWriter bw = null; 
     StringWriter sw = null; 

     List<File> fileList = new ArrayList<File>(); 

     SimpleDateFormat ft = new SimpleDateFormat("yyyymmdd_hh_mm_ss_ms"); 


     try { 

      //Read report.new file 
      reportNew = new File("c:\\temp\\report.new"); 

      //Create temp directory for newly created files   
      writeToDir = new File("c:\\temp"); 
      //tempDir.mkdir(); 

      //Separate report.new into many files separated by a token 
      br = new BufferedReader(new FileReader(reportNew)); 
      sw = new StringWriter(); 
      new StringBuilder(); 



      String line; 
      int fileCount = 0; 

      while (true) { 

       line=br.readLine(); 

       if (line == null || line.contains("%PDF")) { 

        if (!sw.toString().isEmpty()) { 

         fileCount++; 

         File _file = new File(writeToDir.getPath() 
              + File.separator 
              + fileCount 
              + "_" 
              + ft.format(new Date()) 
              + ".htm"); 

         _file.deleteOnExit(); 
         fileList.add(_file); 


         bw = new BufferedWriter(new FileWriter(_file)); 
         bw.write(sw.toString()); 

         bw.flush(); 
         bw.close(); 
         sw.getBuffer().setLength(0); 

         System.out.println("File " 
              + _file.getPath() 
              + " exists " 
              + _file.exists()); 
        } 

        if (line == null) 
         break; 
        else 
         continue; 
       } 

       sw.write(line); 
       sw.write(System.getProperty("line.separator")); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (bw != null) { 
       try { 
        bw.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+1

Es wäre wahrscheinlich nützlich, Ihren Punkt mit Code zu veranschaulichen – beresfordt

2

Um die Datei zu schließen, die Sie in Ihrem Programm geöffnet haben, erstellen Sie eine explizite Beendigungsmethode.

Deshalb versuchen Schreiben folgend:

public class ClassThatUsesFile { 

    private String filename; 
    private BufferReader reader; 

    public ClassThatUsesFile (String afile) { 
     this.filename = afile; 
     this.reader = new BufferReader(new FileReader(afile)); 
    } 

    // try-finally block guarantees execution of termination method 

    protected void terminate() { 
     try { 
      // Do what must be done with your file before it needs to be closed. 
     } finally { 
      // Here is where your explicit termination method should be located. 
      // Close or delete your file and close or delete your buffer reader. 
     } 
    } 

} 
-7

Keine Probleme hier. deleteOnExit() funktioniert für mich wie ein Zauber.

File file = new File(UUID.randomUUID().toString() + ".html"); 
file.deleteOnExit(); 

// open file here 

// process file here 

// flush/close file here 
Verwandte Themen