关闭使用FileOutputStream创建的文件,以进行下一次删除
我目前在Java代码中遇到了FileOutputStream的问题。
实际上我使用FileOutputStream来创建文件,但是一旦创建了文件,就无法删除它。 据我所知,这可能来自FileOutputstream未关闭的事实。
在我的汇总代码下面:
outFile = new FileOutputStream(dir+"\\"+fileName); outFile.write("Test"); outFile.flush(); outFile.close(); outFile = null; System.gc();
然后就没有办法删除文件,即使是“手动”。 当我的程序启动时,我无法通过简单的del删除它在Windows上。 我还尝试删除文件夹目录的内容,但它也没有用,使用此代码:
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(); } } }
所以我的问题是:如何关闭此文件以进行下一次删除(或者如果我们无法关闭它,如何正确删除它)?
这是Java中的一个错误。 是的它很少,但它们存在;)你可以在outFile.close()
之后添加outFile.close()
outFile = null; System.gc();
然后尝试删除它。 如果这不起作用,还有更多可能性。 让我知道。
UPDATE
对我来说它有效:
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
我通过删除行outFile=null; System.gc;
提到的例子Sumit Singh尝试了它outFile=null; System.gc;
outFile=null; System.gc;
这对我来说也很有用。 所以FileOutputStream
不应该有问题。 你能试试上面的小例子并说明它是否有效吗?
UPDATE
void closeQuietly(FileOutputStream out) { try { out.flush(); out.close(); } catch(Exception e) {} }
现在只需调用finally
块中的方法!
我有同样的问题,delete()方法为我的文件返回false。
在我的情况下,在创建文件,写入其FileOutputStream和删除文件之间的某处,我使用的是FileInputStream,忘了为它调用close()。
因此,也许在您的代码中的某个地方,您将另一个流附加到此文件,并将其保持打开状态。
在找到问题的真正根源之前,我使用了一个simle hack来暂时解决这个问题:
FileOutputStream fos = new FileOutputStream(myFile); fos.close(); myFile.delete();
在我的文件上调用delete之前,我在它上面创建了另一个FileOutputStream,然后调用了close()。
这将解锁此文件上的所有前置锁定,并允许您调用delete()。
这样做仍然不是一个好习惯。 您应该找出谁使用您的文件并以正确的方式解决它。
那么,关闭文件输出和输入流的方法是:
name.close()
你的删除代码看起来很好。 我的建议是使用FileIO而不是FileOutputStream,除非您使用FileOutputStream是有充分理由的。 程序关闭后你能删除文件吗?
你可以尝试这个代码..
File file = new File(dir+"\\"+fileName); FileOutputStream outFile; try { outFile = new FileOutputStream(file); outFile.write("Test".getBytes()); outFile.flush(); outFile.close(); } catch (Exception e) { e.printStackTrace(); } file.delete();
您可以查看以下链接..
- 我无法删除java中的文件
- Java’file.delete()’没有删除指定的文件!
- Java 6文件删除
最好使用Apache Commons IO中的FileUtils.deleteDirectory 。 克服Java删除错误,减少使用的代码量,最重要的是,它可以工作。
而不是打电话
delDir(place);
只是打电话
FileUtils.deleteDirectory(new File(place));
更新:在您的delDir
方法中,您调用:
deleteDirectory(new File(path + "\\" + f[j]));
但结果
File[] f = path.listFiles();
将已包含文件中的路径,因此您可以使用:
deleteDirectory( f[j].getPath() );
不是真的相关但是:
这个关闭文件的解决方案帮助我解决了另一个问题。 当从java 6运行程序时,新进程被暂停,直到我关闭我的应用程序(在java 7中它没问题)。 基于这个答案的解决方案有助于:
String[] com = new String[]{javaRun, arg1, arg2, arg3, arg4}; Process proc = Runtime.getRuntime().exec(com, null, dir); proc = null; System.gc();
这适用于java 6.感谢您的灵感。
问题可能在第一行:outFile = new FileOutputStream(dir +“\”+ fileName);
- 不确定是否需要新的。
- 不要相信该目录应该包含在路径中。 AFAIK FileOutputStream的目录定义为app内部目录。
HTH