我正在制作游戏并开始研究一个名为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");
}
}
}
答案 0 :(得分:3)
答案 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。 ;)