3

ファイルの移動/名前変更に耐えられるファイルへのある種のファイルハンドルが必要です。これはプラットフォームに依存しない必要はありません。Java7+Linux でのみ動作する場合は問題ありません。また、ファイルがディレクトリを変更しないと想定できる場合でも問題ありません。

ユースケースは、logstash-file-input に似たログ テーリング入力ソース、つまりファイルをテーリングするために実行できるツールを書きたい場合です。テーリング アプリケーションがダウンしているため、テーリング アプリケーションが再び起動したときにそのファイルを見つけられるようにしたいと考えています。

BasicFileAttributes.fileKey を見ましたが、fileKey から File/Path オブジェクトに移動する方法が見つかりませんでした。

これができるかどうか誰にもわかりますか?

よろしく/トーマス

4

1 に答える 1

1

これは簡単なデモで、WatchService をセットアップしてイベントを待機します。

Path dir = Paths.get( "/home", "me", "experiments" );
WatchService watcher =  dir.getFileSystem().newWatchService();
dir.register( watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY );
WatchKey key = watcher.take();
for (WatchEvent<?> event: key.pollEvents()) {
    System.out.println( event.kind().name() + " " + event.context() );
}

このプログラムが呼び出しで待機している間にmv xyz.dat abc.datが実行されると、次のイベントを含む WatchKey が作成されます。./experimentstake()

ENTRY_DELETE zyx.dat
ENTRY_CREATE xyz.dat

コンテキストは、ディレクトリから変更された要素への相対パスです。

後で、ファイルのデバイスと inode を決定し、おそらくサイズと作成日を追加することで、Linux にファイルの「ID」を登録することができます。その後、制御を取り戻した後、同じディレクトリであると想定して、このファイルを検索できます。

Path dir = Paths.get( "/home", "wlaun", "Java_Experiments" );
Path file = dir.resolve( "a.log" );
Object fileKey = Files.getAttribute( file, "fileKey" );
Object creaTime = Files.getAttribute( file, "creationTime" );
System.out.println( fileKey.toString() + creaTime.toString() );

1.8.0_20 では、creationTime と lastAccessTime が混同されているようです。

于 2015-02-28T12:46:32.467 に答える