在文件监视期间,RandomAccessFile的readBytes函数发生IOException

时间:2012-08-17 15:05:48

标签: java file-io ioexception

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

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

  

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

我将带有文件名的Map作为键,将RandomAccessFile对象作为值保留,并在将此对象添加为侦听器后将其填充如下:

  

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

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

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

  

randomAccessFile_list.get(file.getAbsolutePath())读(字节阵列);

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

go的内容:

  

cd / path / to / app

     

./杀

     

nohup ./app.run& amp;

杀戮的内容:

  

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

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

app.go的内容:

  

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

     

export CLASSPATH = $ CLASSPATH

     

echo $ CLASSPATH

     

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

我很抱歉在您阅读之前发布了一个看起来令人筋疲力尽的问题,但我真的很想知道,任何帮助都会非常感激。

提前致谢。

1 个答案:

答案 0 :(得分:1)

从方法名称看,您正在使用this进行文件监控。它实际上并没有打开文件,它只是偶尔对它进行统计。

然后,您还要在地图中保留一个单独的文件句柄。

只有在修改时间发生变化时,库才会触发事件 - 这并不意味着文件中添加了任何新的数据。然后,您显然尝试从文件句柄中读取并获得IO异常。

这种方法存在许多问题,但如果没有看到更多的代码,就无法准确地告诉您问题是什么。我猜测受监视的进程在重新启动时会截断,删除或对文件执行其他操作,这会使打开的文件句柄无效。

当您想要重新加载整个文件(通常是属性文件或正在编辑的文档)时,通常会使用这样的文件监视,而不是尝试执行“尾部”。