Java 识别新创建的文件并对其进行处理

Java 识别新创建的文件并对其进行处理,java,Java,基本上,我必须监视文件夹中新创建的文件 在我的项目中,我们有一个调度程序,每10分钟运行一次,现在我们要做的是读取所有文件名并签入数据库,如果它已经被处理,或者没有被处理,那么在数据库中输入一个条目并处理它 我在谷歌上搜索了一下,发现很少有解决方案涉及listner的路径,比如JNotify、FileAlterationObserver类以及FileAlterationMonitor,但我必须监视大约20个文件夹,所以我一直在寻找任何更简单的解决方案,比如每当我读到一个文件时,将其标记为已处理(

基本上,我必须监视文件夹中新创建的文件

在我的项目中,我们有一个调度程序,每10分钟运行一次,现在我们要做的是读取所有文件名并签入数据库,如果它已经被处理,或者没有被处理,那么在数据库中输入一个条目并处理它

我在谷歌上搜索了一下,发现很少有解决方案涉及listner的路径,比如JNotify、FileAlterationObserver类以及FileAlterationMonitor,但我必须监视大约20个文件夹,所以我一直在寻找任何更简单的解决方案,比如每当我读到一个文件时,将其标记为已处理(重命名并附加“已处理”),下次读取未标记为“已处理”的文件

使用这种方法,我必须读取文件夹中的所有文件,并检查每个文件名是否以“已处理”结尾


我是jave的新手,所以我不知道这是否可能,所以我的问题是,我可以查询所有不以“Processed”结尾的文件名,而不迭代文件夹中的所有文件名吗


或者任何人有其他解决方案吗?

如果您可以更改文件名,那么您可以将文件重命名为“old_file_name+Processed”,然后只处理名称不以“Processed”结尾的文件。

一旦处理完,我们还需要该文件吗?谁在修改文件?如果是通过程序,该程序是否需要有关已处理文件的信息?当该程序要修改文件时,是否要将其从file1\u processed重新重命名为file1
如果您更改文件名,您必须考虑这些用例以及更多的用例(虽然我不知道您的系统的详细信息,但我觉得它会完成)。
最好只使用我们的
JNotifier
,它的使用非常简单。使用此选项,您实际上可以删除调度程序。每当某个特定文件(添加/修改等)收到通知时,您实际上可以仅针对该文件更新数据库,而无需遍历文件夹。
只需确保在少数情况下,您可以在
JNotifier
中收到多个通知,例如,添加新文件时,您会被添加、修改;重命名后,您会被重命名、修改。所以这些事情你必须小心。
使用旧的调度程序,您也可以这样做。您可以将文件最后更新的时间戳保存在数据库中。在下一个计划中,您只需检查最新的时间戳,如果时间戳较新,则处理它并重新更新数据库。
您还可以混合使用
JNotify
和调度器。通过通知您更新某些
ADT
中更改/修改的文件名,调度程序可以在ADT内搜索,获取修改的文件路径,并仅在数据库中更新这些文件


您可以从下面的示例中获得帮助

public void register(String path) throws JNotifyException {
        int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED
                | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
        boolean watchSubtree = true;
        if (pathSet.contains(path)) {
            return;
        }
        System.out.println("Adding watch for: " + path);
        JNotify.addWatch(path, mask, watchSubtree,
                new JNotifyListener() {

                    @Override
                    public void fileCreated(int arg0, String folderName, String fileName) {
                        fileChanged("New object created: " + fileName + " in folder: " + folderName);

                    }

                    @Override
                    public void fileDeleted(int arg0, String folderName, String fileName) {
                        fileChanged(fileName + " deleted in folder: " + folderName);
                    }

                    @Override
                    public void fileModified(int arg0, String folderName, String fileName) {
//                      fileChanged(fileName + " modified in folder: " + folderName);
                    }

                    @Override
                    public void fileRenamed(int arg0, String folderName, String oldFileName,
                            String newFileName) {
                        fileChanged(oldFileName + " renamed to: "+ oldFileName +" in folder: " + folderName);
                    }
                });
    }

    private void fileChanged(String str){
        //your code here
    }

我可以查询所有不以“已处理”结尾的文件名,而不迭代文件夹中的所有文件名吗?一旦处理,我们不再需要该文件,我们只需要新创建的文件,因此我不需要修改,删除操作,但我必须监视20个这样的路径,所以我应该使用JNotifier,因为如果它因某种原因失败,那么这将是一个大问题。如果您不需要已处理的文件,那么您只需将它们移出文件夹并放入某个存档文件夹。当您的程序在原始文件夹中搜索时,它不会获取那些已处理的文件,只获取新文件。有了这个,你不必检查任何条件,如已处理或未处理等。。。因此,您的程序性能和可维护性将提高。是的,但将它们移动到另一个文件夹意味着服务器上有一个新文件夹,我不确定我们是否能够做到这一点,因为归档是一项自动控制的工作,它归档1个月前的文件。是的,但自动化程序也可以更改。然后,自动化程序可以直接检查到您已将文件从基本文件夹移动到的文件夹,如果文件已存在一个月,则可以通过自动化工具将其移动到存档文件夹。我不知道你们的全部产品。我提供的一些解决方案可能对你们的产品不可行。您可以过滤我的建议,并提出合适的解决方案。是的,更改control-m作业对我来说不是一个选项。感谢Abhinaba的评论。