Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

ファイルの更新を検出する

たびたびすみません。
ファイルの中身が更新(書き込み)されたら、
その中身を読みに行くというプログラムを作成しているのですが、まずファイルの更新を検出できなくて困っております。
特定のテキストファイル1つだけの更新を見張るコトができればよいのですが。。。。
何かよい方法とかあればご教授お願いいたします。

javaのバージョンは1.5.0_10です。

8

回答

6749

閲覧

8件の回答

評価

0

FileWatchdogというクラスを見つけたのですが
実際に使ってるサンプルが一切見あたらないのですが
どなたか具体的な利用方法を教えてはいただけないでしょうか?
よろしくお願いいたします。

評価

0

FileWatchdogはLog4jというログAPIですよね?
ファイルの更新を検出するだけなら必要ないと思います。

FileクラスのlastModifiedメソッドを使ってはいかがでしょうか?

評価

0

ご回答ありがとうございます。
ileWatchdogそのとおりです。
必要ないですか・・・。

lastModifiedメソッドはファイルの更新日時を検出
するものですよね?
前回の更新日時と比べられれば更新を検出できる。
という事でしょうか?
前回の更新日時を保存して今のものと比べるという事
はできますか?

そのプログラムを常にまわし続けて例えば1秒に一回
見に行くようなものにしたいのですが・・・。

実際にはどのようにプログラムを組んだらいいのか
全然思いつかないのです。

具体案などあったらよろしくお願いします。

評価

0

この手の処理は、基本的に、Threadを作成して目的の処理を実行します。
今回の場合、lastModifiedを監視すれば良いでしょう。

FileWatchdogは知りませんでしたが、ざっとソースコードを見ましたが、ThreadをDaemonモードで実行して、同様の処理を数十行で実装しているだけです。

自分でソースを読めるのであれば、1分もあれば、概要は把握できるでしょう。

>実際に使ってるサンプルが一切見あたらない
仮にサンプルが一切ないとしても、ソースを読めば、
使用方法は自ずと理解できるでしょう。

まずは、ソースを読んでみてください。

評価

0

ご回答ありがとうございます。
Threadという概念は全くありませんでした・・・。
まずThreadの勉強をしてみます。
>自分でソースを読めるのであれば、1分もあれば、概要は把握できるでしょう。
ソースを一生懸命読んでますが一行理解するのに5分以上かかるレベルです。。。

現在見つけたソースを元に作成した内容です。
とりあえず、更新の検出だけしてみようと思って記述してあります。
まだエラーは出てますが・・・
エラー内容は
NoSuchMethodError:mainなので、foo様の回答をいただいて
Threadを利用すれば解決できるかなとぼんやり思っています。


public class FileLastModified {

    protected Map  fLastModifieds;

    protected void main(String[] args) {

        File file = new File("Sample.txt");
        Long lastModified = (Long) fLastModifieds.get(file);
        long mtime = file.lastModified();

        if(lastModified == null){
            fLastModifieds.put(file,new Long(mtime));
            System.out.println("更新はありませんでした。");
        }else{
            if(lastModified.longValue() < mtime){
                fLastModifieds.put(file,new Long(mtime));
                System.out.println("更新が検出されました");
                }
            }
        }
    }

評価

0

>まずThreadの勉強をしてみます。
>ソースを一生懸命読んでますが一行理解するのに5分以上かかるレベルです。。。

ソースの読み書きが困難であれば、折角、動作する(と思われる)ソースコードがあるのですから、1から書こうとせず、そのソース理解しながらを徐々に変更したほうが良いのでは?

Threadも勉強すれば、より理解が深まると思いますよ。

評価

0

>ソースの読み書きが困難であれば、折角、動作する(と思われる)ソースコードがあるのですから、1から書こうとせず、そのソース理解しながらを徐々に変更したほうが良いのでは?

動作するソースコードがないので困っているのです。
これは何個かの似たようなソースを見つけて一個づつ
組み合わせたりして作成してます。

public class FileLastModified{

    protected Map  fLastModifieds;

    public void start(){
        Thread thread = new Thread(new Checker());
        thread.start();
    }

    protected void check(){
        File file = new File("Param.txt");
        Long lastModified = (Long) fLastModifieds.get("Sample.txt");
        long mtime = file.lastModified();

        if(lastModified == null){
            fLastModifieds.put(file,new Long(mtime));
            System.out.println("更新はありませんでした。");
        }
        else if(lastModified.longValue() < mtime){
                fLastModifieds.put(file,new Long(mtime));
                System.out.println("更新が検出されました");
            }
        }


    protected class Checker implements Runnable{
        public void run(){
            try{
                Thread.sleep(500L);
            }catch(InterruptedException e){}
            check();
        }
    }
}

現在このようにして、Client.javaを作成し、そちらから
アクセスするようにしてるのですが、
NullPointerExcwptionを吐き出すのでNullの場所をなんとかしようと思っています。
このような感じでエラーがなくなったら動きますかね?

他によい方法、ご指摘ありましたらご教授お願いします。

評価

0

import java.io.File;
import java.util.Map;
import java.util.HashMap;

/**
 * ファイルの更新をチェックする
 */
public class FileLastModified{

    protected Map  fLastModifieds;
    private static boolean fStop;

    public void start(){
        fLastModifieds = new HashMap();
        Thread thread = new Thread(new Checker());
        thread.start();
    }
         
    public void stop(){
        fStop = true;
    }

    protected void check(){
         //監視するファイル
        File file = new File("Sample.txt");
   
        Long lastModified = (Long) fLastModifieds.get(file);
                  //最終更新日時の取得
        long mtime = file.lastModified();
         //ファイル更新検出
        if(lastModified == null){
            fLastModifieds.put(file,new Long(mtime));
        }
        else if(lastModified.longValue() < mtime){
                fLastModifieds.put(file,new Long(mtime));
                  //ファイルが更新された時に実行する処理
                Test test = new Test();
                test.main();


            }
        }


         //whileがtrueな限りcheck()を実行する。
    protected class Checker implements Runnable{
        public void run(){
            while (!fStop){
                try{
                    Thread.sleep(500L);
                    }catch(InterruptedException e){}
                    check();
                }
            }
        }
    }


として、クライアント側↓で実行しました。
    public class Client{

    public static void main(String[] args) {
        FileLastModified modified = new FileLastModified();
        modified.start();

        }
    }


ここでたくさんのヒントを頂き何とか動くようになりました。
本当にありがとうございました!!
プログラムとしてはぐちゃぐちゃっぽいですけど・・・。
これからキレイなプログラムとかも書けるように頑張っていきますので、また何かありましたがよろしくお願いします。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。