gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:44 29 4
gpt4 key购买 nike

在此代码中,我希望使用给定路径内容的最新版本更新 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”到“abc123"

请注意,所有这些都来自打开文件/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

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

请注意 oldfilepath 是如何解析为“/workspaces/.goutputstream-MFJ6HX”,以及后来为同一文件解析为“/workspaces/.goutputstream-BRC1HX”。

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

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

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

我可以在每个 ENTRY_MODIFY 周围的封闭 ENTRY_CREATE 事件中看到文件名,但我希望有一种比以某种方式(获取不是 ENTRY_MODIFY 的最近事件,然后从中获取 .context()。)

谢谢!

最佳答案

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

保存后

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

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

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

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

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

关于java - WatchService WatchEvent .context() 方法在 ENTRY_MODIFY 上返回不一致的文件相对路径(goutputstream-####,Linux 操作系统),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24315840/

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