2011-09-25 55 views
5

我在Eclipse中制作了一个Java程序。我开始使用Windows XP,但最近升级了。为什么我的程序不能删除它在Win7下创建的文件?

作为其保存机制的一部分,程序将设置写入文件settings_new.sav。如果这样,它会删除settings.sav,并重新命名为与旧名称匹配。虽然它在winXP下工作(至少我认为它确实,但我现在无法检查),但在win7下,它无法删除该文件,即使它是创建该文件的程序(尽管该程序是一个不同的实例)。

该文件被Eclipse拾取,并可以从那里很愉快地删除。我可以手动删除它。我是我自己电脑上的管理员。该文件夹就在工作区文件夹内,并不在Program Files文件夹中(尽管如此,我不知道最终用户是否会安装它)。该程序可以创建和修改文件就好了。它不会抛出任何异常,我认为如果它是win7阻止它的话。

任何想法?

回答

9

这是由于java.make中的文件锁定机制,请务必在完成时关闭缓冲流,例如BufferedReader,BufferedInputStream。

+0

它实际上是Windows中的文件锁定机制。在Linux下,相同的代码可能工作得很好。但我同意,您应该明确关闭文件的访问权限,以使其在任何地方正常工作。 –

+0

@MarkRobinson:有趣的是,我也应该在Linux中测试我的swing应用程序。似乎开发人员应该在操作系统级别而不是JVM上预见问题。 – PraveenMax

+1

Windows和Linux有不同的文件锁定语义。 Linux将允许你删除一个你已经打开的文件进行编辑而不会被炸毁。然后,您可以创建一个具有相同名称的新文件,而不会出现问题。在Windows中,如果文件在另一个进程中打开,它可以防止删除文件。这种情况发生的具体情况很大程度上取决于它是如何打开的(通过方法/和访问类型)。如果你有更多的问题,我建议你发布一个针对Windows家伙的新SO问题:) –

-3

我曾经有这个问题,当你完成使用你的文件,你必须设置你的文件等于空。因此,如果您执行以下操作:

public void createFile(String path) 
{ 
    File file = new File(path); 
    file.createNewFile(); 
    file = null 
} 

您必须在完成使用后将该文件设置为空,以便系统停止使用该文件。你必须用FileReader和FileWriter来做同样的事情。您必须将文件读取器和文件编写器设置为空,才能再次访问该文件。试试这个,让我知道它是怎么回事。

+2

这不起作用。所有要做的就是让Java垃圾回收器稍后再继续提取。后来未定义。您应该明确地关闭文件的访问权限,而不是等待垃圾收集器获取它。 –

+0

多数民众赞成什么设置它为空做,当你设置为空的Java自动垃圾收集。 – gsfd

+2

这意味着它可用于收集,而不是即时收集。它可以,但它是非常特定于JVM的行为。 –

相关问题