DeleteOnExit не удалять файл

Я создал несколько файлов для временного использования и использовал их как входы для некоторых методов. И я позвонил

deleteOnExit() 

для всех файлов, которые я создал. Но один файл все еще остается.

Я предполагаю, что это потому, что файл все еще используется, но не компилятор переходит к следующей строке только после завершения текущей строки? (Single thread)

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

 Thread.sleep(sometime);

Изменить: -

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

После создания всех файлов (5) я просто добавил эту строку

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

Все файлы, кроме последнего, удаляются.

Ответ 1

Убедитесь, что все потоки, записываемые в файл, закрыты. Если поток не закрыт, файл будет заблокирован, а delete вернет false. Это был вопрос, который у меня был. Надеюсь, это поможет.

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();
                }
            }
        }
    }
}

Ответ 2

Чтобы закрыть файл, который вы открыли в своей программе, попробуйте создать явный метод завершения.

Поэтому попробуйте написать следующее:

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.
        }
    }

}

Ответ 3

Здесь нет проблем. deleteOnExit() работает для меня как шарм.

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

// open file here

// process file here

// flush/close file here