このコードでは、特定のパスのコンテンツの最新バージョンで HashMap を更新し、文字列としての絶対パスをキーとして使用することを望んでいます。問題は、WatchEvent
の.context()
メソッドが、イベントごとに同じファイルに対して異なる相対パスを提供していることです。
コードのスニペットを次に示します。
else if(event.kind()==StandardWatchEventKinds.ENTRY_MODIFY)
{
/*Variable path is a Path of "//workspaces", set earlier.*/
Path oldfilepath=path.resolve((Path)event.context()); /*problem line*/
String oldfilepathstring = oldfilepath.toString();
FileReader oldIn = new FileReader(oldfilepathstring);
BufferedReader br = new BufferedReader(oldIn);
String line;
List<String> newfiletext=new LinkedList<>();
while((line = br.readLine())!=null)
newfiletext.add(line);
List<String> previousText=new LinkedList<>();
if((previousText = fileMappings.get(oldfilepathstring))!= null)
{
System.out.println("previoustext:\n"+previousText);
System.out.println("newfiletext:\n"+newfiletext);
}
fileMappings.put(oldfilepathstring, newfiletext);
System.out.println(fileMappings.keySet()+"\n"+fileMappings.values());
}
}
b.txt
監視対象ディレクトリ内のファイルの内容を「abc」から「abc 123」に変更した場合の出力例を次に示します。
これはすべて、ファイル /workspaces/b.txt (既に存在する) を開いてその内容を変更するだけであることに注意してください。) :
走る: ENTRY_CREATE:.goutputstream-BRC1HX ENTRY_MODIFY:.goutputstream-BRC1HX [/workspaces/.goutputstream-BRC1HX] [[]] ENTRY_MODIFY:.goutputstream-BRC1HX 前のテキスト: [] 新しいファイルテキスト: [abc] [/workspaces/.goutputstream-BRC1HX] [[abc]] ENTRY_CREATE:b.txt~ ENTRY_CREATE:b.txt ENTRY_CREATE:.goutputstream-MFJ6HX ENTRY_MODIFY:.goutputstream-MFJ6HX [/workspaces/.goutputstream-MFJ6HX、/workspaces/.goutputstream-BRC1HX] [[], [abc]] ENTRY_MODIFY:.goutputstream-MFJ6HX 前のテキスト: [] 新しいファイルテキスト: [abc, 123] [/workspaces/.goutputstream-MFJ6HX、/workspaces/.goutputstream-BRC1HX] [[abc, 123], [abc]] ENTRY_CREATE:b.txt~ ENTRY_CREATE:b.txt
気になるラインは
Path oldfilepath=path.resolve((Path)event.context());
oldfilepath
同じファイルが "/workspaces/.goutputstream-MFJ6HX" に解決され、その後 "/workspaces/.goutputstream-BRC1HX" に解決される方法に注意してください。
event.context()
変更するたびに、同じファイルに対して異なるパスを返しています。これは Linux の問題ですか、それとも Java の問題ですか? また、このファイルの標準相対パス (この場合は "b.txt") を正確に取得するにはどうすればよいですか?
変更を実行すると、一連の作成/変更/作成イベントを取得しているようですENTRY_CREATE
.sには正しいファイル名があり、ENTRY_MODIFY
sには一時ハンドルがあります(ファイルの一時バージョンを推測しています)ファイルの変更をキャプチャし、そのイベントから正しいファイル名を取得できるようにする必要があります。
ファイルを開いたり、変更したり、保存したりするときに、ファイルシステムが内部で一時ファイルの作成と処理を行っている可能性があることは理解していますが、イベントを示す一時ファイルから適切なファイル名を正確に抽出するにはどうすればよいENTRY_MODIFY
ですか? この変更に関連するイベントをグループ化して、囲みENTRY_CREATE
を見つけてそこからファイル名を取得できるようにする方法はありますか? または、どういうわけか、これにつながる呼び出しのスタックを上に移動しますENTRY_CREATE
か?
ENTRY_CREATE
各 を囲んでいる囲んでいるイベントでファイル名を見ることができますが、ENTRY_MODIFY
何とかするよりもこれを行うためのよりエレガントな方法があることを願っています (そうではなかった最新のイベントを取得しENTRY_MODIFY
、それから取得.context()
します。)
ありがとう!