2012-05-12 31 views
0

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

我现在正在做的是使用LogIOThread我写的是使用FileInputStream.avail来检查文件是否已被追加。如果是这样,我附加到一个不可编辑的JTextArea(实际上是一个具有可变滚动功能的修改的JTextArea)。我的最终游戏是有一个自动滚动的JTextArea,它基本上是滚动log4j输出的日志文件。这对我来说很好。我想适应这个非日志文件。

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

我想,当我这样做时,我可能想要更强大的处理中间文件插入的第二个用例,如属性文件更改。我想我可以让textArea做一个换行,如果我能弄清楚是否换行。

我有一个要求(未由我设置)使用Java6,所以一些新的nio FileWatcher对我来说并不好。一般来说,通知器似乎反作用,因为我通过FileInputStream捕获附加信息。这也导致我打折其他库如Commons和jnotify。我可能错了,但也许FileInputStream.avail不是我的最佳方式了。

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

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

有什么建议吗?我不反对改变LogIOThread的工作方式,如果有一个建议获取新文本并使用某种优于文件+文件修改检查组合的方式进行更改。

回答

1

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

不要使用available()作为File.length()的替代品。看到Javadoc。这不是它的目的。

+0

我同意这两点。 我认为我已经抛出了文件大小减少作为有效满足两种使用情况 - - 实际上我发现它不会满足任何用例... 我用来检查附加文本(不适用于更改或长度)。这仍然不正确,或者有更好的方法来检查FileInputStream中的附加文本吗? – Dandromeda

+0

@ user837631是的,我已经在我的回答中提到过了。available()告诉你有多少字节可以被读取*没有阻塞。*它与输入的总长度没有必要的关系。 – EJP

+0

@ EJP你是说使用File.length() - 最后一个长度来读取自上次检查后追加的下一个字节数? (代替使用可用的()) – Dandromeda

0

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

相关问题