Удаление файла Java 6 - PullRequest
       37

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

11 голосов
/ 11 ноября 2011

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

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

Я на работе и застрял на 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 вместо FileInputStream имело для него значение, но я просто не понимаю, как это применимо.

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

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

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

Ответы [ 2 ]

18 голосов
/ 11 ноября 2011

Вы пытаетесь удалить () файл, на который все еще ссылается активный, открытый 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.");
8 голосов
/ 11 ноября 2011

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

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

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.");
    }
}
...