文件监控期间 RandomAccessFile readBytes 函数上的 IOException



我正在监视另一个不断写入它的 Java 进程的日志文件。这两个进程(监视应用程序和受监视的应用程序)在 linux 发行版 centos 上运行。

问题是每次重新启动受监视的应用程序时,监视应用程序似乎都会收到此错误:

java.io.IOException:输入/输出错误 at java.io.RandomAccessFile.readBytes(Native Method) at java.io.RandomAccessFile.read(RandomAccessFile.java:361) at LogMonster.fileChanged(LogMonitor.java:57) at FileMonitor.fireFileChangeEvent(FileMonitor.java:96) at FileMonitor$FileMonitorTask.run(FileMonitor.java:128) at java.util.TimerThread.mainLoop(Timer.java:512) at java.util.TimerThread.run(Timer.java:462)

我保留了一个以文件名作为键,RandomAccessFile 对象作为值的 Map,并在将此对象添加为侦听器后按如下方式填充它:

monitor.addFileChangeListener(logMonitor, LogFileName, LogMonitor_Properties.getTimeDelay()); randomAccessFile_list.put(LogFileName, new RandomAccessFile(LogFileName, "r"));

每次修改文件时都会触发一个事件,并且在 eventFired 函数中,我在重新启动受监视的应用程序后尝试从 RandomAccessFile 读取内容(在重新启动之前它工作正常)。

"fileChanged"函数中的以下代码行导致错误:

randomAccessFile_list.get(file.getAbsolutePath()).read(byteArray);

我使用 bash 脚本杀死应用程序的所有版本,然后在"go"文件中重新启动它。

围棋内容:

cd/path/to/app

。/杀

Nohup ./app.run &

杀戮内容:

kill -9 $(lsof app.run| awk '{print $2}')

kill -9 $(lsof app.log| awk '{print $2}')

kill -9 $(lsof app.go| awk '{print $2}')

app.run的内容:

.

/app.go>>app.log 2>&1

应用内容.log: 只是应用程序的文本输出。

app.go的内容:

/path/to/some/other/location/setClassPath.go

导出类路径=$CLASSPATH

回声$CLASSPATH

/

usr/local/jdk1.6.0_27/bin/java -cp $CLASSPATH MyApp

我很抱歉在你阅读之前发布了一个看起来很累的问题,但我真的已经到了我的智慧尽头,任何帮助将不胜感激。

提前谢谢。

从方法名称来看,您正在将其用于文件监视。它实际上并没有打开文件,它只是每隔一段时间统计一次。

然后,您还将为地图中的文件保持单独的文件句柄打开状态。

仅当修改时间更改时,库才会触发事件 - 这并不意味着有任何新数据添加到文件中。然后,您显然尝试从文件句柄读取并获取 IO 异常。

这种方法存在许多问题,但是如果不查看更多代码,就不可能确切地告诉您问题所在。我猜受监视的进程在重新启动文件时正在截断、删除或对文件执行其他操作,从而使您打开的文件句柄无效。

像这样的文件监控通常在您想要重新加载整个文件(通常是属性文件或正在编辑的文档)时使用,而不是用于尝试执行"尾巴"。

最新更新