将当前日期时间(实时)与上次修改的文件进行比较

时间:2015-05-29 18:26:17

标签: java file date timer

我希望我的程序输出,只要它从客户端收到一个文本文件,它就会打印"收到一个新文件!"。文本文件将存储在C:/ Users /%UserProfile%/ Desktop / ad。

下面的代码是检查是否已收到新的文本文件 。目录

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.swing.Timer;


public class Test {

    final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    static int count = 0;
    static File[] f = null;
    static Date date = new Date();  
    static Calendar now = null;

    public static void main(String[] args) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        while(true) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            f = new File("C:/Users/roberts/Desktop/ad").listFiles();
            int l = f.length;
            System.out.println("There are " +  l +  " files in the directory");

            for (int i = 0; i < l; i++) {
                System.out.println("file " + i +  " date modified " + dateFormat.format(f[i].lastModified()));
            }
        }
    }
}

最初输出目录中的文件总数= 1,最后修改

enter image description here

收到文件后,目录中文件总数的输出= 2,最后修改

enter image description here

现在为了打印&#34;已收到新文件!&#34;我需要将当前日期时间与文件的上次修改日期时间进行比较。

这就是我做的事情

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.swing.Timer;


public class Test {

    final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    int interval = 1000;
    static int count = 0;
    static File[] f = null;
    static Date date = new Date();  
    static Calendar now = null;

    public static void main(String[] args) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        while(true) {

                f = new File("C:/Users/roberts/Desktop/ad").listFiles();
                int l = f.length;
                System.out.println(l);
                new Timer(1000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        now = Calendar.getInstance();
                        for (int i = 0; i < l; i++) {
                            if(dateFormat.format(now.getTime()).equals(dateFormat.format(f[i].lastModified()))) {
                                System.out.println("A new file has been received!");
                            }
                        }

                    }
                }).start();

            try {
                Thread.currentThread().join();
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }
}

我试过了,但它没有打印&#34;收到了一个新文件!&#34;。请帮忙

2 个答案:

答案 0 :(得分:1)

最好使用Watch Service来查看文件系统更改。现在您正在轮询文件更改,但监视服务使用本机Windows事件。

首先,您只需要创建WatchService类的实例。

Path path = Paths.get("c:\mydir");
WatchService service = path.getFileSystem().newWatchService();

接下来,您必须决定要监控的事件类型。我想您只希望在文件夹中出现新文件时收到通知。

path.register(service, StandardWatchEventKinds.ENTRY_CREATE);

接下来,service就像一个事件的缓冲区。我建议把这个缓冲区的处理放在一个单独的线程中。

// repeat forever
for (;;)
{
  // this will block until there's something inside the buffer
  WatchKey key = service.take();

  // 1 watchkey can contain multiple events, you need to iterate these.
  for (WatchEvent<?> event : key.pollEvents())
  {
    //todo: handle events
  }
}

答案 1 :(得分:0)

这是因为您的while(true)循环不循环,因此检查目录大小的代码只能运行一次,变量l保持不变。你通过调用Thread.currentThread().join()永久地阻塞线程(当前线程阻塞直到当前线程停止,即永远)。 Timer每1000毫秒触发一次,但由于l没有更改,因此找不到新文件。

如果您只想查看目录以进行更改,而不是重新发明轮子,最好使用标准JDK类https://docs.oracle.com/javase/8/docs/api/java/nio/file/WatchService.html