Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Close a file created with FileOutputStream, for a next delete

I am currently facing some problem with a FileOutputStream in my Java code.

Actually I am using a FileOutputStream for creating a file, but then once the file is created there is no way for deleting it. As far as I could understand, this may come from the fact that the FileOutputstream is not closed.

On below my summarized code :

     outFile = new FileOutputStream(dir+"\\"+fileName);
     outFile.write("Test");
     outFile.flush();
     outFile.close();
     outFile = null;
     System.gc();

Then there is no way to delete the file, even "by hand". When my program is launched, I can't delete it on windows by a simple del. I also tried to remove content of the folder dir and it didn't worked neither, using this code :

static public void delDir( String place )

{
    File path = new File( place );
    System.out.println(path.exists());//return true
    if( path.exists() )
        {
        File[] f = path.listFiles();
        for( int j = 0 ; j < f.length ; j++ )
            {
            if( f[ j ].isDirectory() )
                {
                deleteDirectory( path+"\\"+f[ j ] );
                }
            f[ j ].delete();
            }
        }
}

So my question is : How to close this file for a next delete (or how to delete it properly if we can't close it)?

like image 870
user1619114 Avatar asked Aug 23 '12 16:08

user1619114


2 Answers

It is a bug in Java. Yes it it rarely but they exists ;) Could you add after outFile.close()

outFile = null;
System.gc();

And then try to delete it. There are more possiblity if this is not working. Let me know.

UPDATE

For me it works:

public class FileDeleteExample {
    public static void main(String[] args) throws Exception {
        File f = new File("test.txt");

        FileOutputStream outFile = null;

        try {
            outFile = new FileOutputStream(f);
            outFile.write("Test".getBytes());
        } finally {
            outFile.flush();
            outFile.close();
            outFile = null;
            System.gc();
        }

        f.delete();
    }
}

UPDATE

I tried it with the example Sumit Singh mentioned by deleting the lines outFile=null; System.gc; and this works as well for me. So there should'nt be a problem with the FileOutputStream. Could you try the little example above and say whether it works or not?

UPDATE

void closeQuietly(FileOutputStream out) {
    try { out.flush(); out.close(); } catch(Exception e) {} 
}

Now just call the method in the finally block!

like image 78
christian.vogel Avatar answered Oct 24 '22 08:10

christian.vogel


I had the same problem, the delete() method returned false for my File.

In my case, somewhere in between creating the file, writing to its FileOutputStream and deleting the file, i was using a FileInputStream and forgot to call close() for it.

So, maybe somewhere in your code you attached another stream to this file, and left it open.

Before finding the real source of the problem, i used a simle hack to temporarily fix this:

FileOutputStream fos = new FileOutputStream(myFile);
fos.close();
myFile.delete();

Right before calling delete on my File, i created another FileOutputStream over it and then just called close().

This unlocks all previuous locks on this file and lets you call delete().

Still it is not a good practice to do this. You should find out who uses your file and solve it the right way.

like image 1
Cornelia Avatar answered Oct 24 '22 08:10

Cornelia