Thứ Sáu, 21 tháng 6, 2013

Sử dụng TimerTask để phát hiện sự thay đổi của file trong Java

1.Giới thiệu:

Bài viết này hướng dẫn cách giúp bạn phát hiện sự thay đổi của một file. Với sự theo dõi này ta có thể có những cập nhật động (dynamic) cho ứng dụng. File cần theo dõi có thể là file cấu hình cho ứng dụng hay dữ liệu cần cập nhật liên tục…..

2. Ý tưởng:

Để giải quyết bài toán là bạn sẽ tạo một Thread chạy liên tục và kiểm tra sự thay đổi lần cuối cùng của file sau một khoảng thời gian nào đó do bạn thiết lập. Vì mỗi khi ta edit file, thông tin về thời điểm cập nhật file mới nhất sẽ được thay đổi. Do đó ta sẽ dựa vào thông tin này để kiểm tra.

3. Phần cài đặt:

Ta có thể tạo riêng một class có cài đặt interface Runnable hay kế thừa class Thread để thực hiện điều này hoặc thực hiện khá dễ dàng với sự trợ giúp của class TimerTask có sẵn của Java.TimerTask thực chất cũng chỉ là một class có cài đặt giao diện Runnable.

Ta sẽ tạo một class kế thừa từ TimerTask tên là FileObserver:


import java.util.*;
import java.io.*;


public abstract class FileObserver extends TimerTask {
// Lưu vết thông tin thời gian cập nhật mới nhất của file
private long timeStamp;

// File can theo doi
private File file;

public FileObserver( File file )
{
this.file = file;
this.timeStamp = file.lastModified(); // Ghi nhận thời gian cập nhật mới nhất của file
}

public final void run() {

// Lấy thời gian cập nhật mới nhất của file
long time = file.lastModified();

// nếu thấy khác với biến lưu vết
if( this.timeStamp != time )
{
this.timeStamp = time;
onChange(file); // thì gọi hàm onChange() để thực hiện môột công việc nào đó
}
}

// Các class kế thừa FileWatcher sẽ cài đặt phương thức này
// để thực hiện công việc nào đó
protected abstract void onChange( File file );
}


Tiếp theo ta tạo lớp để test. Lớp này chỉ đơn giản là khi phát hiện sự thay đổi của file thì sẽ in ra màn hình câu thông báo.


import java.util.*;
import java.io.*;


public class FileObserverTest {

public static void main(String args[]) {

TimerTask task = new FileObserver(new File("c:/test.txt"))
{
protected void onChange( File file )
{
// cài đặt nghiệp vụ công việc ở đây
System.out.println( "File " + file.getName() +
" have change !" );
}
};

Timer timer = new Timer();

// lặp lại sự kiểm tra sau mỗi giây
timer.schedule( task , new Date(), 1000 );
}
}


 

0 nhận xét:

Đăng nhận xét