0

我想知道我的程序确定文件是否已附加或完全更改的最佳方法。

我目前正在做的是使用我编写的 LogIOThread,它使用 FileInputStream.avail 检查是否已附加文件。如果是这样,我将附加到不可编辑的 JTextArea (实际上是具有可变滚动功能的修改后的 JTextArea)。我的最终目标是拥有一个自动滚动的 JTextArea,它基本上是滚动 log4j 输出的日志文件。这对我现在很有用。我想将此调整为非日志文件。

我想添加到 LogIOThread 的是一个监视器,它将检查文件内容是否更改,而不仅仅是有新的附加文本。我试图解决的第一个用例是文件在运行中被重写。在最基本的层面上,我想我可以使用这个函数重新加载我的 JTextArea 关闭并重新打开 FileInputStream,如果文件被覆盖,则重新开始。

我想,当我这样做时,我可能想让它更健壮地处理中间文件插入的第二个用例,比如属性文件更改。我想如果我能弄清楚一行是否改变,我可以让 textArea 进行行替换。

我有使用 Java6 的要求(不是我设置的),所以一些新的 nio FileWatcher 对我没有好处。一般来说,通知程序似乎适得其反,因为我正在通过 FileInputStream 捕获附加信息。这也导致我打折其他库,如 Commons 和 jnotify。不过我可能是错的,也许 FileInputStream.avail 不再是我的最佳方式。

我的第一个想法是我可以存储文件大小,并检查它是否急剧变化(变为小于存储的值)。由于新创建的日志文件需要一个新的 textArea,这似乎还不错,并且解决了我的第一个用例。这不适用于文件中特定值更改的第二个用例。对于在我的 IOThread 处于睡眠状态时以一致大小重新创建的文件来说,这也可能是有问题的,尽管我怀疑这可能。

我的第二个想法是我可以不断检查文件修改时间,如果没有可附加的文本,我会重新读取文件并进行行比较?如果我要更改 textArea 中的一行,除非我每次都重新加载它,否则我无论如何都需要这样做。不过,这似乎非常低效。

有什么建议么?我不反对更改 LogIOThread 的工作方式,如果有人建议获取新文本并使用比可用性 + 文件修改检查组合更好的方式进行更改。

4

2 回答 2

1

如果文件大小减小,它肯定已被覆盖。然而,它也可能被更大或更大的东西覆盖,所以反过来不成立。

不要使用 available() 作为 File.length() 的代理。请参阅 Javadoc。那不是它的用途。

于 2012-05-12T17:54:27.223 回答
0

如何创建一个OutputStream读取日志数据的中间体,使其可用于JTextField然后将该数据路由到文件?

于 2014-10-12T09:23:19.387 回答