ホームページ >Java >&#&チュートリアル >Java で Unix の「tail -f」機能を実装するにはどうすればよいですか?

Java で Unix の「tail -f」機能を実装するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-04 18:15:14368ブラウズ

How to Implement Unix

Java で Unix の「tail -f」をエミュレートする

Java で「tail -f」ユーティリティの機能を実装するには、効果的な方法を見つける必要があります。ファイルに新しい追加がないか監視し、プログラムがこれらの新しい行を継続的に読み取ることができる技術またはライブラリ。これを実現するには、次のアプローチを検討してください。

Apache Commons Tailer クラス

注目すべきオプションは、Apache Commons IO の Tailer クラスです。このクラスは、ファイルとその変更を監視するための簡単なソリューションを提供します。 「tail -f」の動作と同様に、ファイルに追加された新しい行を継続的に読み取ることができます。 Tailer クラスとの統合は、次のコードを使用して実現できます。

Tailer tailer = Tailer.create(new File("application.log"), new TailerListener() {
    @Override
    public void handle(String line) {
        // Perform desired operations on the newly added line
    }
});
tailer.run();

カスタム ファイル モニタリング実装

あるいは、定期的に実行するカスタム ファイル モニタリング実装を作成することもできます。ファイルサイズの変更をチェックし、それに応じて内部バッファを更新します。このアプローチでは、Java 内のファイル システムの動作とイベント リスニング メカニズムをより深く理解する必要があります。簡略化した例を次に示します。

import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class TailFileMonitor implements Runnable {

    private File file;
    private long lastFileSize;

    public TailFileMonitor(File file) {
        this.file = file;
        this.lastFileSize = file.length();
    }

    @Override
    public void run() {
        Path filePath = file.toPath();
        try {
            WatchKey watchKey = filePath.getParent().register(new WatchService(), StandardWatchEventKinds.ENTRY_MODIFY);
            while (true) {
                WatchKey key = watchKey.poll();
                if (key == watchKey) {
                    for (WatchEvent<?> event : key.pollEvents()) {
                        WatchEvent.Kind<?> kind = event.kind();
                        if (kind == StandardWatchEventKinds.ENTRY_MODIFY && event.context().toString().equals(file.getName())) {
                            tailFile();
                        }
                    }
                }
                key.reset();
            }
        } catch (IOException e) {
            // Handle IO exceptions
        }
    }

    private void tailFile() {
        long currentFileSize = file.length();
        if (currentFileSize != lastFileSize) {
            try (BufferedReader br = new BufferedReader(new FileReader(file))) {
                br.skip(lastFileSize);
                String line;
                while ((line = br.readLine()) != null) {
                    // Process newly added lines
                }
                lastFileSize = currentFileSize;
            } catch (IOException e) {
                // Handle IO exceptions
            }
        }
    }
}

カスタム モニターを利用するには、インスタンスを作成し、スレッドとして実行します。ファイルの変更を常に監視し、それに応じてバッファを更新します。

以上がJava で Unix の「tail -f」機能を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。