0

ログファイルの読み取りとデータベース内の一致したパターンストアに次のコードを使用しています。

public class MIScript {

//DB
public static void db(String email, String ip, String pdate, String hostname, String im) {


   // DATABASE INSERT


}

public void pop(File f, String IM) throws FileNotFoundException, IOException, InterruptedException {
    int pos = 0;
    RandomAccessFile file = new RandomAccessFile(f, "r");
    pos = (int) file.length() - (int) Math.min(file.length() - 1, file.length());

    file.seek(pos);
    for (; true; Thread.currentThread().sleep(1000)) {
        int l = (int) (file.length() - pos);
        if (l <= 0) {
            continue;
        }
        byte[] buf = new byte[l];
        int read = file.read(buf, 0, l);
        String out = new String(buf, 0, l);
        //   System.out.println(out);
        InputStream is = new ByteArrayInputStream(out.getBytes());
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while (((line = in.readLine()) != null)) {
            if (line.contains("LOG")) {

               // SOME CODE 

                //INSERT INTO DATABASE
                MIScript.db(// parameters //);

            }
        }
    }
}

public static void main(String[] args) {

    try {
        File pop = new File("d://ABC.log");
        MIScript tail1 = new MIScript();
        tail1.pop(pop, "TEST");


    } catch (ArrayIndexOutOfBoundsException ar) {
        System.out.println("Errrrr------" + ar);
        System.exit(1);
    } catch (Exception io) {
        io.printStackTrace();
        System.out.println("Errrrr2------" + io);
        System.exit(1);
    }
}

}

単一のファイルでうまく機能しますが、同期的に読み取るには4つのファイルが必要です。これを行う方法を教えてください。私は2つのファイルでこれをやろうとしましたが、うまくいきません

4

1 に答える 1

0

各ファイルを個別のスレッドで読み取り、データベースに書き込むコードがスレッドセーフであることを確認する必要があります。

編集:これをコメントに入れましたが、実際には答えの一部です:Java 7から、ファイルが変更されたときにファイルシステムからコールバックすることができますhttp://docs.oracle.com/javase/7/docs/api /java/nio/file/WatchService.html そうすれば、今行っているようにファイル サイズをポーリングする必要はありませんが、ファイルごとに 1 つのスレッドが必要です。

WatchService のチュートリアルはこちら: http://docs.oracle.com/javase/tutorial/essential/io/notification.html

于 2013-06-14T08:47:35.923 に答える