2012-02-29 7 views
0

J'ai cette méthode qui obtient la dernière ligne d'un fichier .txt et crée un nouveau fichier temporaire sans cette ligne. Mais quand j'essaye de supprimer le .txt qui a la ligne que je veux supprimer (ainsi je peux renommer le dossier de temp) pour une raison que je ne peux pas. Voici le code:Impossible de supprimer le fichier 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); 
    } 
} 

Ce qui est drôle est que lorsque j'appuie sur le bouton qui appelle la méthode une fois, rien ne se passe (« Impossible de supprimer le fichier »), la deuxième fois, il fonctionne très bien et le 3e que je reçois " Impossible de renommer le fichier ".

+1

Familiarisez-vous avec le bloc 'finally'. Cela vous aidera à fermer les fichiers correctement et de manière claire. – Jagger

Répondre

1

Est-ce que BufferedReader ferme le lecteur imbriqué (non mentionné dans le document)? Vous devez vous assurer, en vérifiant si setWritable a réussi.Autrement, vous devez fermer FileReader aussi, et je recommanderais parce que dans le cas où vous le fermez deux fois il n'y a pas de mal ... par la façon dont l'appel GC est plus nocif qu'utile.

+0

Je ne vous suis pas, quel lecteur imbriqué? Ours avec moi Im un débutant: S J'ai ajouté le .setWritable et le GC. juste pour m'assurer parce que je ne savais pas ce qui n'allait pas avec le code. Je l'ai enlevé et continue toujours à obtenir la même erreur. – Dangerosking

+0

Oh, lisez la réponse à nouveau et vu que je n'avais pas fermé un lecteur dans une autre partie du code, je l'ai fermé et cela a fonctionné, merci :) – Dangerosking

3

Le fichier ne peut pas être supprimé s'il a été ouvert par un autre processus. Par exemple. dans le bloc-notes ou peut-être même un autre FileReader/FileWriter sur le fichier ailleurs dans votre code. En outre, lorsque vous l'exécutez dans un environnement de développement intégré, vous risquez que l'environnement IDE touche le fichier pendant l'analyse en arrière-plan pour y apporter des modifications dans le dossier du projet. Plutôt stocker les fichiers dans un chemin absolu en dehors du projet de l'EDI.

De même, le flux de code d'ouverture et de fermeture des fichiers doit être modifié de sorte que la fermeture soit effectuée dans le bloc finally. L'idiome est comme ceci:

Reader reader = null; 

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

Ou, si vous êtes déjà sur Java 7, utilisez le automatic resource management à la place.

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

En outre, je recommande d'utiliser File#createTempFile() à la place pour créer des fichiers temporaires. De cette façon, un nom de fichier temporaire unique sera généré et ainsi vous empêchez le même fichier temporaire d'être écrit et renommé par plusieurs processus.

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