什么是指我的文件,阻止我成功调用.delete()?

时间:2011-08-31 08:51:23

标签: java exception delete-file

我正在制作游戏并开始研究一个名为SaveManager的类,到目前为止,除了删除游戏外,我没有任何问题。

我的问题是这个,.delete()大部分时间都返回false,而不会调用异常。

如果我创建一个循环(下面),它最终会删除,尽管我实际上没有更改任何变量或引用,游戏循环本身肯定不会处理文件,所以它不会“释放”在任何时候提交自己。

public void delete(File save)
    {
        while (save.exists() && !save.delete())
            {
                i++;
            }
        new infoBox("Times delete called: " + i, "delete method in saveManager");

所以我的问题是:如果引用不是来自我的一个类,我如何找到并删除它,允许我删除上面的循环,这基本上劫持游戏直到文件消失。

以下是处理文件的代码,以防我实际上做错了(God Forbid!)我很确定这会“释放”有问题的保存文件...

private void save()
{
    ObjectOutputStream OOS = null;
    BufferedOutputStream BOS = null;
    FileOutputStream FOS = null;
    try
        {
            File saveFile = new File(saveDirectory + hub.world.saveName + ".dat");
            OOS = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(saveFile, false)));

            OOS.write... (List of Objects & Strings here)
            OOS.flush();
            OOS.close(); 

            game.saved = true; //Used for warning message on exit
            this.setSavesList();
        }
    catch (Exception e)
        {
                new errorWindow(e, "SaveFile, I/O error");
        }
    finally
        {
            try
                {
                    FOS.flush();
                    FOS.close();
                    BOS.flush();
                    BOS.close();
                    OOS.flush();
                    OOS.close();
                }
            catch (IOException e)
                {
                    hub.frame.errorWindow(e, "Problem closing streams");
                }
        }

}

5 个答案:

答案 0 :(得分:3)

在处理文件时要检查的一般事项是,如果您在尝试删除任何打开的流之前关闭它们。

除非打开的流已关闭,否则无法删除文件。

看看this

答案 1 :(得分:3)

您正在创建三个流,并且只关闭最顶层的一个(OOS)。

您应手动关闭每个流。我想这会解决你的问题。

此外,将close()放在finally块中通常被认为是一种好习惯,所以它肯定会发生。

FileOutputStream fos = new FileOutputStream(fileName);
try 
{
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        OOS = new ObjectOutputStream(bos);

        OOS.write... (List of Objects & Strings here)
        OOS.flush();
        OOS.close(); 

        bos.flush();
        bos.close();

        game.saved = true; //Used for warning message on exit
        this.setSavesList();
} catch (IOException ioe)
{
}
finally
{
  fos.close();
}

否则,您可能会刷新对象输出流,并且数据只会卡在缓冲的输出流中,并且永远不会被写入文件输出流。

答案 2 :(得分:2)

这里有一个值得深思的东西......从上面的代码中,你使用了一个try-catch块...我的猜测是上面的一个操作是抛出一个异常,因为out.close()操作正在被跳过...为什么不添加一个“finally”块并关闭那里的流...它肯定会帮助你省去麻烦。

答案 3 :(得分:1)

您确定您的文件实际上是在创建吗?在上面的代码片段中,您有while(!save.delete())但稍后您似乎将其称为saveFile,这些可能是两个不同的文件!我首先通过执行

检查文件是否存在于磁盘上
if(!saveFile.exists()) {
do something here
}

如果它不存在,删除将只返回false,你不能删除不存在的文件。

答案 4 :(得分:0)

如果要检查删除结果,还需要检查文件是否存在。显然,如果没有文件或它已被删除,delete()将返回false。 ;)