我目前在Java代码中遇到了FileOutputStream的一些问题。
实际上我使用FileOutputStream来创建文件,但是一旦创建了文件,就无法删除它。据我所知,这可能来自FileOutputstream未关闭的事实。
在我的汇总代码下面:
outFile = new FileOutputStream(dir+"\\"+fileName);
outFile.write("Test");
outFile.flush();
outFile.close();
outFile = null;
System.gc();
然后就无法删除文件,甚至“手动”。当我的程序启动时,我无法通过简单的del在Windows上删除它。我还尝试删除文件夹 dir 的内容,但它也没有用,使用此代码:
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();
}
}
}
所以我的问题是: 如何关闭此文件以进行下一次删除(或者如果我们无法关闭它,如何正确删除它)?
答案 0 :(得分:13)
这是Java中的一个错误。是的它很少,但它们存在;)你可以在outFile.close()
之后添加
outFile = null;
System.gc();
然后尝试删除它。如果这不起作用,还有更多可能性。让我知道。
<强>更新强>
对我来说,它有效:
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();
}
}
<强>更新强>
我通过删除行outFile=null; System.gc;
提到的示例Sumit Singh尝试了它,这对我来说也很有用。所以FileOutputStream
不应该有问题。你能试试上面的小例子并说明它是否有效吗?
<强>更新强>
void closeQuietly(FileOutputStream out) {
try { out.flush(); out.close(); } catch(Exception e) {}
}
现在只需调用finally
块中的方法!
答案 1 :(得分:1)
我有同样的问题,delete()方法为我的文件返回false。
在我的情况下,介于创建文件,写入FileOutputStream和删除文件之间的某处,我使用的是FileInputStream,忘了为它调用close()。
因此,也许在您的代码中的某个地方,您将另一个流附加到此文件,并将其保持打开状态。
在找到问题的真正根源之前,我使用了一个simle hack来暂时解决这个问题:
FileOutputStream fos = new FileOutputStream(myFile);
fos.close();
myFile.delete();
在我的文件上调用delete之前,我在它上面创建了另一个FileOutputStream,然后调用了close()。
这解锁了此文件上的所有前置锁,并允许您调用delete()。
这样做仍然不是一个好习惯。您应该找出谁使用您的文件并以正确的方式解决它。
答案 2 :(得分:0)
关闭文件输出和输入流的方法是:
name.close()
你的删除代码看起来很好。我的建议是使用FileIO而不是FileOutputStream,除非您使用FileOutputStream是有充分理由的。程序关闭后你能删除文件吗?
答案 3 :(得分:0)
您可以尝试此代码..
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();
您可以查看以下链接..
答案 4 :(得分:0)
最好使用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() );
答案 5 :(得分:0)
并非真正相关,但是:
这个关闭文件的解决方案帮助我解决了另一个问题。当从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.感谢您的灵感。
答案 6 :(得分:0)
问题可能在第一行: outFile = new FileOutputStream(dir +&#34; \&#34; + fileName);
HTH