2016-04-29 18 views
1

私のクラスにメソッドを作成する際に、予期しない問題が発生しました。私は他のシアトルのソリューションを試しましたが、彼らは私のために働いていません。私の方法では、単に指定された行を見つけ、不要な行をスキップしてファイルをコピーし、元のファイルを削除し、一時ファイルの名前を元のファイルの名前に変更するだけです。正常に新しいファイルが作成されますが、一時ファイルの名前を元の名前に変更できないため、以前のファイルを削除できません。私は理解できません、なぜですか?ファイルを削除したり名前を変更できないのはなぜですか?

void lineDelete(String file_name, String line_to_erase){ 
    try { 
     int line_number = 0; 
     String newline = System.getProperty("line.separator"); 
     File temp = new File("temporary.txt"); 
     File theFile = new File(file_name+".txt"); 
     String path = theFile.getCanonicalPath(); 
     File filePath = new File(path); 

     BufferedReader reader = new BufferedReader(new FileReader(file_name + ".txt")); 
     BufferedWriter writer = new BufferedWriter(new FileWriter(temp)); 

     String lineToRemove = line_to_erase; 
     String currentLine; 

     while((currentLine = reader.readLine()) != null) { 
      String trimmedLine = currentLine.trim(); 
      if(trimmedLine.equals(lineToRemove)){ 
       continue; 
      } 
      writer.write(currentLine + newline)); 
     } 
     writer.close(); 
     reader.close(); 
     filePath.delete(); 
     temp.renameTo(theFile); 
    } 
    catch (FileNotFoundException e){ 
     System.out.println(e); 
    } 
    catch (IOException e){ 
     System.out.println(e); 
    } 
+2

例外はありますか? – TDG

+0

投稿されたコードはコンパイルされません。 tempFileが定義されていません。本当に問題がある実際のコードを投稿してください。 Files.deleteとFiles.moveを使用すると、問題の内容を説明するメッセージが表示されます。 –

+0

いいえ、私は例外を取得していないし、tempFileについてはごめんね、それをtempに変更するのを忘れました。変数がより明確になるように元のコードを編集しました。 –

答えて

1

は、このコードを試してみてください。

void lineDelete(String file_name, String line_to_erase){ 
try { 
    int line_number = 0; 
    String newline = System.getProperty("line.separator"); 
    File temp = new File("temporary.txt"); 
    File theFile = new File(file_name+".txt"); 
    String path = theFile.getCanonicalPath(); 

    BufferedReader reader = new BufferedReader(new FileReader(theFile)); 
    BufferedWriter writer = new BufferedWriter(new FileWriter(temp)); 

    String lineToRemove = line_to_erase; 
    String currentLine; 

    while((currentLine = reader.readLine()) != null) { 
     String trimmedLine = currentLine.trim(); 
     if(trimmedLine.equals(lineToRemove)){ 
      continue; 
     } 
     writer.write(currentLine + newline)); 
    } 
    writer.close(); 
    reader.close(); 
    theFile.delete(); 
    temp.renameTo(file_name + ".txt"); 
} 
catch (FileNotFoundException e){ 
    System.out.println(e); 
} 
catch (IOException e){ 
    System.out.println(e); 
} 
+0

メソッドを実行する前にファイルfile_name.txtが既に存在していて、何行か変更されていますか? temp.renameTo()はFile型のメソッドで、 ".txt"などの文字列は使用できません。 –

+0

いいえ、以前のファイルを削除した後、ファイルの名前を別のファイルの名前に変更するメソッドを呼び出すだけです。あなたのロジックは大丈夫だと言い、テンポラリファイルにはあなたが望む出力が得られると言ったので、あなたがしなければならないのは私の答えに投稿したものだけです – Ricardo

+0

実際、あなたはやっていません。あなたが既に存在するファイル名を与えている場合は、File.openを使用して、それが存在するかどうかを確認してください。もしそうなら、あなたのロジックを – Ricardo

1

私は、削除および/または名前の変更が失敗する理由のカップルを提案することができますが、を推測するよりも、あなたの問題を解決するためのより良い方法があります。

PathFiles.delete(Path)Files.move(Path, Path, CopyOption...)のメソッドを使用すると、操作が失敗した場合に例外がスローされます。例外の名前とメッセージは、が実際にになるのを手がかりにする必要があります。

javadocはherehereです。


1 - ここでは、推測のカップルです:1)ファイルは、他の場所で開かれている、それは結果として、ロックされています。 2)ファイルを削除するアクセス権がありません。

関連する問題