WatchService WatchEvent .context()方法为ENTRY_MODIFY上的文件返回不一致的相对路径(goutputstream - ####,Linux OS)

时间:2014-06-19 20:38:39

标签: java watchservice

在这段代码中,我希望用给定路径内容的最新版本更新HashMap,并将绝对路径作为字符串用作键。 问题是WatchEvent的{​​{1}}方法为每个事件提供了相同文件的不同相对路径。

以下是一段代码:

.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()); } } 时的示例输出 内容 “ABC” 至 “ABC 123"

请注意,所有这一切都来自打开文件/workspaces/b.txt(已存在)并修改其内容。)


    run:
    ENTRY_CREATE:.goutputstream-BRC1HX
    ENTRY_MODIFY:.goutputstream-BRC1HX
    [/workspaces/.goutputstream-BRC1HX]
    [[]]
    ENTRY_MODIFY:.goutputstream-BRC1HX
    previoustext:
    []
    newfiletext:
    [abc]
    [/workspaces/.goutputstream-BRC1HX]
    [[abc]]
    ENTRY_CREATE:b.txt~
    ENTRY_CREATE:b.txt
    ENTRY_CREATE:.goutputstream-MFJ6HX
    ENTRY_MODIFY:.goutputstream-MFJ6HX
    [/workspaces/.goutputstream-MFJ6HX, /workspaces/.goutputstream-BRC1HX]
    [[], [abc]]
    ENTRY_MODIFY:.goutputstream-MFJ6HX
    previoustext:
    []
    newfiletext:
    [abc, 123]
    [/workspaces/.goutputstream-MFJ6HX, /workspaces/.goutputstream-BRC1HX]
    [[abc, 123], [abc]]
    ENTRY_CREATE:b.txt~
    ENTRY_CREATE:b.txt

感兴趣的是      b.txt

请注意Path oldfilepath=path.resolve((Path)event.context());如何解析为“/workspaces/.goutputstream-MFJ6HX”,以及后来的“/workspaces/.goutputstream-BRC1HX”为同一文件。

每次修改后,

oldfilepath都会为同一文件返回不同的路径。 这是一个Linux问题,还是一个Java问题,以及我如何获得此文件的标准相对路径(在这种情况下,它是“b.txt”)?

似乎当我执行修改时,我得到一系列创建/修改/创建事件,event.context() s具有正确的文件名,而ENTRY_CREATE s具有临时文件handle(我猜测在保存之间使用的文件的临时版本。)我需要能够捕获文件修改并从该事件中提取正确的文件名。

据我所知,我的文件系统可能正在创建临时文件&amp;我正在打开,修改和保存文件时在引擎盖下进行处理,但是我究竟如何从指示ENTRY_MODIFY的事件给出的临时文件中提取正确的文件名?是否有某种方法可以对与此修改相关的事件进行分组,以便我可以找到封闭的ENTRY_MODIFY并从中获取文件名?或者以某种方式向上遍历导致此ENTRY_CREATE的一堆电话?

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

谢谢!

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。我认为它与任何Linux问题或任何Java问题无关。这就是b.txt(我假设gedit)的编辑处理事物的方式。

保存后

  1. 使用一些随机xxxx(您看到的创建)创建一个新的临时文件“.goutputstream-xxxx”,

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

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

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

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

答案 1 :(得分:0)

我有同样的问题。我使用过滤器来排除此问题。 例如:我需要路径/ 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());

此修复程序对我来说