Удаление файла Java 6

Я знаю, что этот вопрос является бушующим дубликатом этого вопроса. Однако, теперь я прочитал эту целую страницу дважды, а некоторые разделы - три раза, а для жизни меня не вижу, как/на что он отвечает!

Итак, по моей проблеме.

Я работаю и застрял с использованием Java 6 SE и не могу обновить до 7. Я пишу программу, которая создает файл, записывает на него, выполняет некоторую обработку и затем должен удалить файл из своего существования. У меня такая же проблема, как и у человека, который задал вопрос, на который я ссылаюсь выше: Java не удалит файл, и я не могу понять, почему.

Код:

File f = null;
FileWriter fw = null;
try
{
    f = new File("myFile.txt");
    fw = new FileWriter(f);
    fw.write("This is a sentence that should appear in the file.");
    fw.flush();
    if(f.delete())
        System.out.println("File was successfully deleted.");
    else
        System.err.println("File was not deleted.");
}
catch(Exception exc)
{
    System.err.println(exc.getMessage());
}
catch(Error er    {
    System.err.println(er.getMessage());
}
catch(Throwable t)
{
    System.err.println(t.getMessage());
}
finally
{
    fw.close();
}

Он не бросает никаких кавычек, ошибок или исключений (я включил их, чтобы исключить любые случаи краев). Второй оператор печати ("File was not deleted.") печатается на консоли. Я запускаю это в Windows 7 и пишу в папку, где у меня есть полные разрешения (rwx).

Пользователь, задающий вопрос, на который я ссылался, ответил на свой вопрос, но делает это (по моему скромному мнению) не так прямолинейно. В любом случае у меня возникают проблемы с пониманием этого. Он/она, похоже, ссылается на то, что использование BufferedReader, а не a FileInputStream, сделало для него разницу, но я просто не понимаю, как это применимо.

Java 7, похоже, устранила эти проблемы с введением класса java.nio.file.Files, но опять же, я не могу использовать Java 7 по причинам, выходящим за рамки моего контроля.

Другие ответчики на этот ссылочный вопрос ссылаются на то, что это "ошибка" на Java, и дают всевозможные исключения, например, явное обращение к System.gc() и т.д. Я пробовал все это, и они не работают.

Может быть, кто-то может добавить свежую перспективу и пробежаться, думая обо мне.

Ответ 1

Вы пытаетесь удалить() файл, который по-прежнему ссылается на активный, открытый FileWriter.

Попробуйте следующее:

f = new File("myFile.txt");
fw = new FileWriter(f);
fw.write("This is a sentence that should appear in the file.");
fw.flush();
fw.close(); // actually free any underlying file handles.
if(f.delete())
    System.out.println("File was successfully deleted.");
else
    System.err.println("File was not deleted.");

Ответ 2

Вы можете удалить файл только в том случае, если обработчик файлов не открыт. Поскольку вы открываете файл hanlder с помощью FileWriter, вам нужно закрыть его, прежде чем вы сможете его удалить. Другими словами, f.delete должен выполняться после fw.close

Попробуйте выполнить приведенный ниже код. Я внес изменения, чтобы предотвратить все возможные ошибки, которые могут возникнуть, например, если fw равно null.

File f = null;
FileWriter fw = null;
try {
    f = new File("myFile.txt");
    fw = new FileWriter(f);
    fw.write("This is a sentence that should appear in the file.");
    fw.flush(); // flush is not needed if this is all your code does. you data
                // is automatically flushed when you close fw
} catch (Exception exc) {
    System.err.println(exc.getMessage());
} finally {// finally block is always executed.
    // fw may be null if an exception is raised in the construction 
    if (fw != null) {
        fw.close();
    }
    // checking if f is null is unneccessary. it is never be null.
    if (f.delete()) {
        System.out.println("File was successfully deleted.");
    } else {
        System.err.println("File was not deleted.");
    }
}