我希望我的程序输出,只要它从客户端收到一个文本文件,它就会打印"收到一个新文件!"。文本文件将存储在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,最后修改
收到文件后,目录中文件总数的输出= 2,最后修改
现在为了打印&#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;。请帮忙
答案 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