2014-07-15 6 views
10

Stworzyłem kilka plików do tymczasowego użytku i wykorzystałem je jako dane wejściowe dla niektórych metod. I nazywałam siędeleteOnExit nie kasowanie pliku

deleteOnExit() 

wszystkich utworzonych przeze mnie plikach. Ale jeden plik nadal pozostaje.

Przypuszczam, że to dlatego, że plik jest nadal w użyciu, ale nie kompilator przejść do następnej linii dopiero obecna linia jest zrobione? (Gwint Single)

Choć nie jest to problem, ponieważ praktycznie Nadpisywanie java, zawsze jest tylko jeden plik. Chciałbym zrozumieć, dlaczego tak się dzieje, a także jeśli mogę użyć

Thread.sleep(sometime); 

Edycja: -

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

Po utworzeniu wszystkich plików (5), po prostu dodaje ten wiersz

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

Wszystkie pliki z wyjątkiem tego ostatniego zostały usunięte.

+2

Będziesz chciał dołączyć swój kod. Problem może być w tym. –

+0

Czy rzeczywiście opuściłeś proces Java? –

+0

Potencjalnie lepszym sposobem na poradzenie sobie z tym problemem jest użycie finalizatorów ... –

Odpowiedz

14

Upewnij się, że cokolwiek strumienie są zapisywanie do pliku są zamknięte. Jeśli strumień nie zostanie zamknięty, plik zostanie zablokowany, a delete zwróci false. To był problem, który miałem. Mam nadzieję, że to pomaga.

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

Byłoby użyteczne zilustrowanie twojego punktu za pomocą kodu – beresfordt

2

Aby zamknąć plik otwarty w programie, spróbuj utworzyć metodę jawnego zakończenia.

Dlatego spróbuj pisząc co następuje:

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

Brak problemów tutaj. deleteOnExit() działa dla mnie jak urok.

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

// open file here 

// process file here 

// flush/close file here 
Powiązane problemy