嘿家伙我想创建一个程序,24/7监视一个目录,如果一个新文件添加到它,那么如果文件大于10mb,它应该排序.我已经实现了我的目录的代码,但我不知道如何在每次添加新记录时检查目录,因为它必须以连续的方式发生.
import java.io.*;
import java.util.Date;
public class FindingFiles {
public static void main(String[] args) throws Exception {
File dir = new File("C:\\Users\\Mayank\\Desktop\\java princeton");// Directory that contain the files to be searched
File[] files= dir.listFiles();
File des=new File("C:\\Users\\Mayank\\Desktop\\newDir"); // new directory where files are to be moved
if(!des.exists())
des.mkdir();
for(File f : files ){
long diff = new Date().getTime() - f.lastModified();
if( (f.length() >= 10485760) || (diff > 10 * 24 * 60 * 60 * 1000) )
{
f.renameTo(new File("C:\\Users\\mayank\\Desktop\\newDir\\"+f.getName()));
} }
}
}
以下是实施监视服务所需的基本步骤:
>为文件系统创建WatchService“观察者”.@H_301_17@>对于要监视的每个目录,请将其注册到观察程序.注册目录时,您可以指定要通知的事件类型.您为每个注册的目录收到一个WatchKey实例.@H_301_17@>实现无限循环以等待传入事件.当事件发生时,密钥将发出信号并放入观察者的队列中.@H_301_17@从观察者的队列中检索密钥.您可以从密钥中获取文件名.@H_301_17@>检索密钥的每个待处理事件(可能有多个事件)并根据需要进行处理.@H_301_17@>重置密钥,然后继续等待事件.@H_301_17@>关闭服务:当线程退出或关闭时(通过调用其关闭的方法),监视服务退出.
作为旁注,您应该支持自Java 7以来可用的java.nio包来移动文件.
renameTo()有一些严重的限制(从Javadoc中提取):
Many aspects of the behavior of this method are inherently@H_301_17@ platform-dependent: The rename operation might not be able to move a@H_301_17@ file from one filesystem to another,it might not be atomic,and it@H_301_17@ might not succeed if a file with the destination abstract pathname@H_301_17@ already exists. The return value should always be checked to make sure@H_301_17@ that the rename operation was successful.
例如,在Windows上,如果目标目录存在,renameTo()可能会失败,即使它是空的.@H_301_17@此外,该方法可能在失败时返回布尔值而不是异常.@H_301_17@通过这种方式,可能很难猜测问题的根源并在代码中处理它.
这是一个执行您的需求的简单类(它处理所有步骤,但不一定需要Watch Service关闭).
package watch;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class WatchDir {
private final WatchService watcher;
private final Map