WatchService WatchEvent .context()方法为ENTRY_MODIFY (goutputst



在这段代码中,我希望用给定路径内容的最新版本更新HashMap,使用绝对路径作为字符串作为键。问题是WatchEvent.context()方法在每个事件上为同一文件提供了不同的相对路径。

下面是一段代码:
            else if(event.kind()==StandardWatchEventKinds.ENTRY_MODIFY)
            {
                /*Variable path is a Path of "//workspaces", set earlier.*/
                Path oldfilepath=path.resolve((Path)event.context()); /*problem line*/
                String oldfilepathstring = oldfilepath.toString();
                 FileReader oldIn = new FileReader(oldfilepathstring);
                 BufferedReader br = new BufferedReader(oldIn);
                 String line;
                 List<String> newfiletext=new LinkedList<>();
                  while((line = br.readLine())!=null)
                    newfiletext.add(line);
                 List<String> previousText=new LinkedList<>();
                 if((previousText = fileMappings.get(oldfilepathstring))!= null)
                 {
                      System.out.println("previoustext:n"+previousText);
                      System.out.println("newfiletext:n"+newfiletext);
                 }
                 fileMappings.put(oldfilepathstring, newfiletext);
                 System.out.println(fileMappings.keySet()+"n"+fileMappings.values());
            }
        }

下面是修改监视目录下的文件b.txt后的输出示例内容"abc"来"美国广播公司123"

注意所有这些都来自于打开/workspace/b.t txt文件(该文件已经存在)并修改其内容。:

<>之前运行:ENTRY_CREATE: .goutputstream-BRC1HX修改:.goutputstream-BRC1HX[/工作区/.goutputstream-BRC1HX][[]]修改:.goutputstream-BRC1HXprevioustext:[]newfiletext:(美国广播公司)[/工作区/.goutputstream-BRC1HX][[abc]]ENTRY_CREATE: b.txt ~ENTRY_CREATE: b.txtENTRY_CREATE: .goutputstream-MFJ6HX修改:.goutputstream-MFJ6HX[/工作区。goutputstream-MFJ6HX/工作区/.goutputstream-BRC1HX][[], [abc]]修改:.goutputstream-MFJ6HXprevioustext:[]newfiletext:[美国广播公司,123)[/工作区。goutputstream-MFJ6HX/工作区/.goutputstream-BRC1HX][[abc, 123], [abc]]ENTRY_CREATE: b.txt ~ENTRY_CREATE: b.txt之前

感兴趣的行是Path oldfilepath=path.resolve((Path)event.context());

注意oldfilepath如何解析为"/workspace/"。goutputstream-MFJ6HX",以及后来的"/workspace/"。相同文件的goutputstream-BRC1HX"。

event.context()在每次修改后都为同一文件返回不同的路径。这是Linux问题,还是Java问题,以及我如何准确地获得该文件的标准相对路径(在本例中,它将是"b.txt")?

似乎当我执行修改时,我得到了一系列创建/修改/创建事件,ENTRY_CREATE s有正确的文件名,而ENTRY_MODIFY s有一个临时句柄(我猜在保存之间使用的文件的临时版本)。我需要能够捕获文件修改,并拉出正确的文件名的事件。

我知道我的文件系统可能正在创建临时文件&处理下的引擎盖,而我只是打开,修改和保存文件,但我究竟如何提取适当的文件名从临时文件,事件指示ENTRY_MODIFY给我?是否有某种方法可以将与此修改相关的事件分组,以便我可以找到封闭的ENTRY_CREATE并从中获取文件名?或者以某种方式向上遍历导致此ENTRY_CREATE的调用堆栈?

我可以在封闭的ENTRY_CREATE事件中看到文件名,围绕每个ENTRY_MODIFY,但我希望有一种更优雅的方式来做到这一点,而不是以某种方式(获得最近的事件不是ENTRY_MODIFY,然后从中获得.context())

谢谢!

我也面临同样的问题。我认为这与任何Linux问题或任何Java问题无关。这只是b.t txt的编辑器(我假设是gedit)处理事情的方式。

保存

  1. 创建一个新的临时文件"。goutputstream-xxxx"带有一些随机的xxxx(您看到的创建),

  2. 将新内容写入该文件(您看到的修改),

  3. 将原始文件重命名为b.txt~(您看到的创建),

  4. 并将临时文件重命名为b.txt(您看到的创建)

所以我猜你必须注意关于b.t txt的ENTRY_MODIFY和ENTRY_CREATE,才能真正看到所有的文件修改

我有同样的问题。我用过滤器来排除这个问题。例如:我需要路径/home/user/data/in;

中的所有文件
Files.walk(Paths.get( System.getProperty("user.home").concat("/data/in")))
                    .map(Path::toString)
                    .filter(path -> ! path.endsWith("/in"))
                    .filter(path -> ! path.startsWith(".goutputstream"))
                    .collect(Collectors.toList());

相关内容

  • 没有找到相关文章

最新更新