2012-02-29 1 views
0

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

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

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

+1

Познакомьтесь с блоком 'finally'. Это поможет вам закрыть файлы в правильном и понятном виде. – Jagger

ответ

1

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

+0

Я не следую за тобой, какой вложенный читатель? Медведь со мной Im начинающий: S Я добавил .setWritable и GC. просто чтобы убедиться, потому что я не знал, что, черт возьми, не так с кодом. Я удалил его и все равно получаю ту же ошибку. – Dangerosking

+0

О, прочитал ответ еще раз и увидел, что я не закрыл читателя в другой части кода, я его закрыл, и это сработало, спасибо :) – Dangerosking

3

Файл не может быть удален, когда он был открыт другим процессом. Например. в блокноте или около того или, возможно, еще один 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, используйте automatic resource management вместо этого.

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

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

File tempFile = File.createTempFile("nexLog", ".txt");