2016-04-18 13 views
1

いくつかの正規表現に基づいて、ファイル内のいくつかの項目を置き換えたいと思います。そうするために:Javaでファイルを読み書きする方法

  • 私はすべての行の行
  • ごとのファイルの行を読んで、私は正規表現をチェックして、私はすべての行は、文字列の配列に書き込まれます交換
  • を行う

これがすべて終わったら、ファイルを削除しようとしました(置き換えられた行で再び作成するため)。

何らかの理由でこれがうまくいかず、BufferedReaderが閉じられた後でも、Javaがそのファイルにハンドルを保持しているようです。

誰もこの(初心者の)質問の解決策を持っていますか?

コードの抜粋:

 Pattern oDatePattern = Pattern.compile("at \\d{2}:\\d{2}:\\d{2} "); // meaning: "at xx:xx:xx" 
     Pattern oTimePattern = Pattern.compile("Kernel time [0-9]*\\.?[0-9]+ User time: [0-9]*\\.?[0-9]+"); // "[0-9]*\.?[0-9]+" stands for any floating point number 
     Pattern oMemoryPattern = Pattern.compile("\\([0-9,A-F]*\\)"); // "[0-9,A-F]*" stands for any hexadecimal number 
     Matcher oDateMatcher; 
     Matcher oTimeMatcher; 
     Matcher oMemoryMatcher; 

     List<String> sLog_Content = new ArrayList<String>(); 

     BufferedReader br = new BufferedReader(new FileReader(sLp_LogFile)); 
     try { 
     String sLine = br.readLine(); 

     while (sLine != null) { 
      System.out.println("ORIG : " + sLine); 
      oDateMatcher = oDatePattern.matcher(sLine); 
      sLine  = oDateMatcher.replaceAll("at <timestamp> "); 
      oTimeMatcher = oTimePattern.matcher(sLine); 
      sLine  = oTimeMatcher.replaceAll("Kernel time <Kernel_Time_usage> User time: <User_Time_usage>"); 
      oMemoryMatcher = oMemoryPattern.matcher(sLine); 
      sLine   = oMemoryMatcher.replaceAll("<Memory_Address>"); 
      System.out.println("REPL : " + sLine); 
      sLog_Content.add(sLine); 
      sLine = br.readLine(); 
     } 
     } finally { 
     br.close(); 
     } 

     System.out.println("All lines are read and regex replaced, try to delete the file"); 

     File tst_File = new File(sLp_LogFile); 
     if (tst_File.exists()) { 
     System.out.println(sLp_LogFile + " exists"); 
     } else { 
     System.out.println(sLp_LogFile + " does not exist"); 
     } 

     if (tst_File.delete()) { 
     System.out.println(sLp_LogFile + " is deleted"); 
     } else { 
     System.out.println(sLp_LogFile + " is not deleted"); 
     } 

出力ログは:

ORIG : Reading buffer 1 (0000000002ED0070) at 15:40:44 (index 125999, size 4410000 lines 126000, total lines read 126000) 
REPL : Reading buffer 1 <Memory_Address> at <timestamp> (index 125999, size 4410000 lines 126000, total lines read 126000) 
... 
ORIG : Sending buffer 1 (0000000002ED0070) at 15:40:44 (index 125999, size 4410000, lines 126000, total lines sent 126000) 
REPL : Sending buffer 1 <Memory_Address> at <timestamp> (index 125999, size 4410000, lines 126000, total lines sent 126000) 
... 
ORIG : Kernel time 0.2808 User time: 0.312 
REPL : Kernel time <Kernel_Time_usage> User time: <User_Time_usage> 
... 
All lines are read and regex replaced, try to delete the file 
D:\Logfile_lp.log exists 
D:\Logfile_lp.log is not deleted 
+0

提案:FileReader参照を保持し、それも閉じます。 Java 7以降を使用する場合は、TRY-with-resources構文を使用できます。 –

+0

@ brso05 - 不要です。 'BufferedReader'の' close() '呼び出しは' FileReader'の 'close()'を呼び出します。 –

+0

あなたは 'Files.delete(path)'を試すことができますか? (java7 +が必要です) – Assaf

答えて

2

一つの可能​​な説明は、アプリケーションがどこかにファイルを開いているということです。

また、ファイルを開いている別のアプリケーションでもかまいません。

または、アプリケーション/ユーザーがファイルを読み取ることはできますが、ファイルを削除する権限はありません。


私はあなたのコードでは問題を見ない

+0

実際、このファイルは次のコードを使用して作成されています: 'exitcode = Runtime.getRuntime()。exec(cmdline).waitFor();'私は、 'waitFor()'メソッドがプロセス全体が終了するのを待っていると仮定します。これは、ファイルが完全に書き込まれ、そのハンドルが解放されたことを意味します。 – Dominique

2

.. Files.deleteを使用しての提案に同意。

ファイルが閉じていることを確認してください。BufferReaderと思われます。 (this response参照)。

Files.delete cf this responseにお試しください。
違う例外を投げることで、削除に失敗したことに関する詳細情報が表示されます。

0

私は初心者です。私はあなたのようなものを知りません。しかし、私が正しいことを知っていれば、変更を最初に一時ファイルに保存してください。その後、一時ファイルを再度読み込み、後で実際のファイルに書き込みます。私のコメントがあなたに役立つことを願っています。

0

おはようございます、 この問題の解決策を探していただきありがとうございます。残念ながら、この問題はJavaベースではありません。書き込みしようとしているファイルはリダイレクトcmd /c <program>.exe >> <output>.logによって作成されており、Windowsが出力バッファに出力バッファを完全にフラッシュして問題を作成していないようです。

私は現在、この問題のために(非常に汚い)以下の回避策使用しています

boolean bFile_can_be_opened = false; 
while (!bFile_can_be_opened) { 
    try { 
    fwLog2 = new FileWriter(sLp_LogFile, true); 
    bFile_can_be_opened = true; 
    } 
    catch (Exception e) 
    {} 
} 

この問題の詳細については、以下の新しいStackOverflowの質問の下に見つけることができます:私は、次のしているHow to release a file, locked by the application, in Java

関連する問題