Java WatchService WatchEvent.context()方法在条目_MODIFY(goutputstream-####,Linux操作系统)上为文件返回不一致的相对路径
在这段代码中,我希望用给定路径内容的最新版本更新HashMap,使用绝对路径作为字符串作为键。 问题是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"
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());