Java WatchService WatchEvent.context()方法在条目_MODIFY(goutputstream-####,Linux操作系统)上为文件返回不一致的相对路径

Java WatchService WatchEvent.context()方法在条目_MODIFY(goutputstream-####,Linux操作系统)上为文件返回不一致的相对路径,java,watchservice,Java,Watchservice,在这段代码中,我希望用给定路径内容的最新版本更新HashMap,使用绝对路径作为字符串作为键。 问题是WatchEvent的.context()方法为每个事件上的同一文件提供了不同的相对路径 下面是一段代码: else if(event.kind()==StandardWatchEventKinds.ENTRY_MODIFY) { /*Variable path is a Path of "//workspaces"

在这段代码中,我希望用给定路径内容的最新版本更新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());
            }

        }
兴趣线是
Path oldfilepath=Path.resolve((Path)event.context())

请注意,
oldfilepath
如何解析为同一文件的“/workspace/.goutputstream-MFJ6HX”,以及更高版本“/workspace/.goutputstream-BRC1HX”

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

似乎当我执行修改时,我得到了一系列创建/修改/创建事件,
条目\u create
s具有正确的文件名,
条目\u modify
s具有临时句柄(我猜是保存之间使用的文件的临时版本)我需要能够捕获文件修改并从该事件中提取正确的文件名

我知道在我打开、修改和保存文件时,我的文件系统可能正在后台创建和处理临时文件,但是如何从指示
ENTRY\u MODIFY
的事件提供给我的临时文件中提取正确的文件名呢?是否有某种方法可以对与此修改相关的事件进行分组,以便我可以找到包含的
条目\u CREATE
,并从中获取文件名?或者通过某种方式向上遍历导致此
项的调用堆栈\u CREATE

我可以在所附的
ENTRY\u CREATE
事件中看到文件名,它围绕着每个
ENTRY\u MODIFY
,但我希望有一种更优雅的方法来实现这一点,而不是以某种方式(获取不是
ENTRY\u MODIFY
的最新事件,然后从中获取
.context()


谢谢

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

一旦拯救它

  • 创建一个新的临时文件“.goutputstream xxxx”,其中包含一些随机xxxx(您看到的创建)

  • 将新内容写入此文件(您看到的修改)

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

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


  • 因此,我想您必须注意b.txt的ENTRY\u MODIFY和ENTRY\u 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());
    

    这是我的修复方法。

    谢谢。让我吃惊的是,Java创建了一个依赖于系统默认文本编辑器的库。我认为,考虑到跨系统的可移植性,这些功能将被排除在外。
    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());