gpt4 book ai didi

java - 如何监视文件夹中的更改?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:29 24 4
gpt4 key购买 nike

我有以下代码用于监视文件夹中是否有 java 中的任何更改:

    public class FolderWatcher
{
// public List<Event> events = new ArrayList<Event>();

public static Event call() throws IOException, InterruptedException
{
LOG.info("Watching folder");
Path _directotyToWatch = Paths.get("data/input-files"); // this will be put in the configuration file
WatchService watcherSvc = FileSystems.getDefault().newWatchService();
WatchKey watchKey = _directotyToWatch.register(watcherSvc, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

watchKey = watcherSvc.take();
for (WatchEvent<?> event : watchKey.pollEvents())
{
WatchEvent<Path> watchEvent = castEvent(event);
LOG.info(event.kind().name().toString() + " " + _directotyToWatch.resolve(watchEvent.context()));
String eventName = event.kind().name();
String fileName = _directotyToWatch.resolve(watchEvent.context()).toString();
watchKey.reset();
return new Event(eventName, fileName);
}
return null;

}

@SuppressWarnings("unchecked")
static <T> WatchEvent<T> castEvent(WatchEvent<?> event)
{
return (WatchEvent<T>) event;
}

}

和:

public abstract class AbstractWatcher
{
abstract void eventDetected(Event event);

private final ScheduledExecutorService threadpool;

public AbstractWatcher(ScheduledExecutorService threadpool)
{
this.threadpool = threadpool;
}

public AbstractWatcher()
{
threadpool = Executors.newSingleThreadScheduledExecutor();
}


public void handle()
{
final FolderWatcherHandler handler = new FolderWatcherHandler();

final Runnable r = new Runnable()
{
@Override
public void run()
{
try
{
Event event = FolderWatcher.call();
if (event != null)
{
handler.eventDetected(event);
}
}
catch (IOException e)
{
LOG.error("failed to watch the update", e);
}
catch (InterruptedException e)
{
LOG.info("thread interrupted", e);
Thread.currentThread().interrupt();
return;
}

}
};

Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
threadpool.shutdown();

}
});

threadpool.scheduleWithFixedDelay(r, 0, 1, TimeUnit.NANOSECONDS);
}
}

和:

public class FolderWatcherHandler extends AbstractWatcher
{
@Override
public void eventDetected(Event event)
{
// Do stuff
}
}

只要文件的修改(在我的例子中主要是添加)是一个接一个地完成的,并且每次添加都有一个小的延迟,那么整个事情就完美了。但是,如果我同时拖放或添加多个文件。此代码仅检测第一个文件的事件,而不检测其余文件。我什至将执行时间以纳秒为单位,但它没有帮助。我想知道这整个代码是执行此操作的正确方法。有人能帮我吗。谢谢。

最佳答案

为什么不在每个文件夹中存储一个元数据文件(递归),在那个元数据文件中你可以存储文件列表和每个文件的修改日期大小。您的线程应该将每个文件夹中的此 metadata 文件与存在于同一文件夹中的 current files 进行比较。这就是您如何检测该文件夹中的任何更改。

请记住,您应该为其中的每个 子文件夹 递归执行此操作。并且 metadata 文件应该在每次扫描时更新。希望这有帮助..

关于java - 如何监视文件夹中的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12077391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com