Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

deleteOnExit not deleting file

Tags:

java

I have created a few files for temporary use and used them as inputs for some methods. And I called

deleteOnExit() 

on all files I created. But one file still remains.

I assume it is because the file is still in use, but doesn't the compiler go to next line only after the current line is done?(Single thread)

While its not a problem practically because of java overwrite, there is only one file always. I would like to understand why it happens and also if I can use

 Thread.sleep(sometime);

Edit:-

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

After creating all files(5), I just added this line

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

All the files except that last one is deleted.

like image 572
raka Avatar asked Jul 15 '14 12:07

raka


2 Answers

Make sure that whatever streams are writing to the file are closed. If the stream is not closed, file will be locked and delete will return false. That was an issue I had. Hopefully that helps.

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();
                }
            }
        }
    }
}
like image 163
Forever Noob Avatar answered Nov 13 '22 10:11

Forever Noob


In order to close the file that you have opened in your program, try creating an explicit termination method.

Therefore, try writing the following:

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

}
like image 27
A.W. Avatar answered Nov 13 '22 09:11

A.W.