Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当文件改变时,我读了文件,文件的内容总是一样的吗?_Java_File_Bufferedreader_Inputstreamreader - Fatal编程技术网

Java 当文件改变时,我读了文件,文件的内容总是一样的吗?

Java 当文件改变时,我读了文件,文件的内容总是一样的吗?,java,file,bufferedreader,inputstreamreader,Java,File,Bufferedreader,Inputstreamreader,我使用jdk1.8提供的watchevent来监听文件更改事件,但是当事件发生时,我读取了文件,但是,文件的内容总是一样的吗? 监视文件更改事件代码: final WatchKey=watcher.take(); for(WatchEvent事件:key.pollEvents()){ //获取事件类型 final WatchEvent.Kind Kind=event.Kind(); //获取文件名 @SuppressWarnings(“未选中”)最终WatchEvent pathWatchEve

我使用jdk1.8提供的watchevent来监听文件更改事件,但是当事件发生时,我读取了文件,但是,文件的内容总是一样的吗? 监视文件更改事件代码:

final WatchKey=watcher.take();
for(WatchEvent事件:key.pollEvents()){
//获取事件类型
final WatchEvent.Kind Kind=event.Kind();
//获取文件名
@SuppressWarnings(“未选中”)最终WatchEvent pathWatchEvent=(WatchEvent)事件;
最终路径文件名=pathWatchEvent.context();
如果(种类==条目\删除){
log.info(字符串格式(“%s文件被删除",文件名);
}else if(种类==条目\修改){
log.info(fileName.toString());
日志信息(“条目修改”);
if(Constant.ERROR\u LOG.equals(fileName.toString())){
字符串filePath=“\\\\192.168.160.128\\share\\error\u log”;
int totaline=FileUtils.countfiletotaline(filePath);
读取文件代码:

File File=新文件(sourceFilePath);
BufferedReader br=新的BufferedReader(新的InputStreamReader(新文件InputStream(文件),“utf-8”);
StringBuilder strBuilder=新StringBuilder();
字符串sLine=null;
而((sLine=br.readLine())!=null){
strBuilder.append(sLine);
strBuilder.append(“\r\n”);
}

我的应用程序在等待文件的kind==ENTRY\u MODIFY时,在使用Watcher服务时遇到了类似的问题,但与您的3分钟延迟不同。您的代码不完整,因此不清楚是否缺少一个重要的位来解释延迟,因此最好能看到完整的代码

不幸的是,watcher服务可以为每个文件生成大量事件,尤其是条目\修改。我发现在循环中调用watcher.poll(超时)并整理集合中接收的事件更可靠。仅在集合变大时操作一次,或者watcher.poll返回空值或自上次处理后的某个时间间隔。类似于:

var modified = new HashSet<Path>();
while(runningFlag) {
    WatchKey k = ws.poll(modified.size() == 0 ? 10 : 1, TimeUnit.SECONDS);
    if (k != null) {
        // Loop through the ENTRY_MODIFY events as before but save the items:
        ... modified.add(fileName);
        if (!k.reset()) { ... handle reconnection  }
    }

    if (modified.size() > 0 && (k == null || modified.size() > limit)) { 
       // Act on modifications set
       ...
       modified.clear();
    }
}
var modified=newhashset();
while(runningFlag){
WatchKey k=ws.poll(modified.size()==0?10:1,TimeUnit.SECONDS);
如果(k!=null){
//循环浏览条目_如前所述修改事件,但保存项目:
…已修改。添加(文件名);
如果(!k.reset()){…句柄重新连接}
}
如果(modified.size()>0&(k==null | | modified.size()>limit)){
//根据修改集采取行动
...
修改的.clear();
}
}

这将减少您执行操作的事件数量,尽管您可能还有其他一些网络装载/缓存问题需要处理。

大约三分钟后,bufferReader可以读取较新的文件内容,为什么?如何立即读取更新的文件内容?同一台机器上的独立程序是否可以看到网络共享的更改在3分钟内完成吗?