Невозможно удалить файл Java - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть этот метод, который получает последнюю строку файла .txt и создает новый временный файл без этой строки.Но когда я пытаюсь удалить .txt, в котором есть строка, которую я хочу удалить (тогда я могу переименовать временный файл), по какой-то причине я не могу.Это код:

void removeFromLocal() throws IOException {
    String lineToRemove = getLastLine();
    File inputFile = new File("nexLog.txt");
    File tempFile = new File("TempnexLog.txt");
    BufferedReader reader = null;
    BufferedWriter writer = null;
    try {

        reader = new BufferedReader(new FileReader(inputFile));
        writer = new BufferedWriter(new FileWriter(tempFile));

        String currentLine;
        int i = 0;
        while ((currentLine = reader.readLine()) != null) {
            i++;                
            String trimmedLine = currentLine.trim();
            if (!trimmedLine.equals(lineToRemove)) {
                if (i != 1) {
                    writer.newLine();
                }
                writer.write(currentLine);
            }
        }
            reader.close();
            reader = null;
            writer.flush();
            writer.close();
            writer = null;
            System.gc();

            inputFile.setWritable(true);

            if (!inputFile.delete()) {
                System.out.println("Could not delete file");
                return;
            }


            if (!tempFile.renameTo(inputFile)) {
                System.out.println("Could not rename file");
            }
        //boolean successful = tempFile.renameTo(inputFile);
    } catch (IOException ex) {
        Logger.getLogger(dropLog.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Забавно то, что когда я нажимаю кнопку, вызывающую метод один раз, ничего не происходит («Не удалось удалить файл»), во второй раз он работает нормально, а третийget "Не удалось переименовать файл".

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Файл нельзя удалить, если он был открыт другим процессом. Например. в блокноте или около того или, может быть, даже другой FileReader / FileWriter в файле где-то еще в вашем коде. Кроме того, когда вы выполняете это в IDE, вы рискуете, что IDE коснется файла во время фонового сканирования для изменений в папке проекта. Скорее сохраняйте файлы по абсолютному пути вне проекта IDE.

Кроме того, поток кода открытия и закрытия файлов должен быть изменен так, чтобы закрытие выполнялось в блоке finally. Идиома такая:

Reader reader = null;

try {
    reader = new SomeReader(file);
    // ...
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}

Или, если вы уже используете Java 7, вместо этого используйте автоматическое управление ресурсами .

try (Reader reader = new SomeReader(file)) {
    // ...
}

Далее я рекомендую использовать File#createTempFile() вместо того, чтобы создавать временные файлы. Таким образом, будет сгенерировано уникальное временное имя файла, и, таким образом, вы предотвратите запись и переименование одного и того же временного файла несколькими процессами.

File tempFile = File.createTempFile("nexLog", ".txt");
1 голос
/ 29 февраля 2012

BufferedReader закрывает вложенный ридер (не упоминается в документе)?Вы должны убедиться, проверив, успешно ли setWritable. В противном случае вам также нужно закрыть FileReader, и я бы порекомендовал, потому что, если вы дважды закроете его, это не повредит ... кстати, вызов GC болеевреднее, чем полезно.

...