Что относится к моему файлу и не позволяет мне успешно вызывать .delete ()? - PullRequest
1 голос
/ 31 августа 2011

Я создаю игру и начал работать с классом под названием SaveManager, поэтому у меня не было никаких проблем, кроме случаев, когда дело доходит до удаления игры.

Моя проблема в том, что .delete () в большинстве случаев возвращает false, без вызова исключения.

Если я сделаю цикл (ниже), он в конце концов удалится, несмотря на то, что я на самом деле не меняю никакие переменные или ссылки, а сам игровой цикл определенно вообще не работает с файлами, поэтому он не "освобождает" Сам файл в любой момент.

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

Итак, мой вопрос: если ссылка не из одного из моих классов, как мне ее найти и удалить, что позволяет мне удалить вышеуказанный цикл, который в основном захватывает игру до тех пор, пока файл не исчезнет.

Вот код, который работает с файлом, на случай, если я на самом деле что-то делаю не так (не дай Бог!) Я уверен, что это "освобождает" рассматриваемый файл сохранения ...

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 ]

3 голосов
/ 31 августа 2011

Вы создаете три потока и закрываете только самый верхний (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();
}

В противном случае вы можете очистить выходной поток объекта, и данные просто застрянут в буферизованном выходном потоке и никогда не будут записаны в выходной поток файла.

3 голосов
/ 31 августа 2011

Одна общая вещь, которую следует проверить при работе с файлами, - это если вы закрываете какие-либо открытые потоки перед попыткой удалить его.

Вы не можете удалить файл, если открытый поток не закрыт.

Взгляните на это .

2 голосов
/ 31 августа 2011

Вот пища для размышлений ... из приведенного выше кода вы использовали блок try-catch ... я предполагаю, что одна из вышеперечисленных операций вызывает исключение, из-за которого операция out.close ()пропускается ... почему бы не добавить блок "finally" и не закрыть там поток ... это определенно поможет вам избежать проблем.

1 голос
/ 31 августа 2011

Вы уверены, что ваш файл действительно создается?В приведенном выше фрагменте кода у вас есть while (! Save.delete ()), но позже вы, похоже, называете это saveFile, это могут быть два разных файла!Сначала я проверил бы, существует ли файл на диске, выполнив команду

if(!saveFile.exists()) {
do something here
}

, если он не существует, удаление просто вернет false, вы не можете удалить файл, который не существует.

0 голосов
/ 31 августа 2011

Если вы проверяете результат удаления, вам также необходимо проверить, существуют ли файлы.Очевидно, что если файла нет или он уже был удален, delete () вернет false.;)

...