2012-02-29 31 views
0

このメソッドは、.txtファイルの最後の行を取得し、その行なしで新しい一時ファイルを作成します。しかし、削除したい行がある.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); 
    } 
} 

面白いが、私は一度メソッドを呼び出すボタンを押すと、何も」、(「ファイルを削除できませんでした」)私が手にそれが正常に動作し二回目と第三の起こらないということですいただきました!ファイルの名前を変更できませんでした "。

+1

「最終的に」ブロックに慣れてください。それは、あなたが右と明確な方法でファイルを閉じるのに役立ちます。 – Jagger

答えて

1

BufferedReader(docには記載されていない)ネストされたリーダーを閉じますか? setWritableが成功したかどうかを確認してください。それ以外の場合はFileReaderも閉じる必要があります.2回クローズすると害はありません.GCコールは役に立つよりも有害です。

+0

私はあなたに従っていない、どのような入れ子の読者ですか?私と初心者のベア: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()を使用して、一時ファイルを作成することをお勧めします。このようにして一意の一時ファイル名が生成されるため、複数のプロセスによって同じ一時ファイルが書き込まれたり名前が変更されるのを防ぐことができます。

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