Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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_Text Files_Fileinputstream - Fatal编程技术网

Java 如何确定文件是追加的还是彻底更改的

Java 如何确定文件是追加的还是彻底更改的,java,text-files,fileinputstream,Java,Text Files,Fileinputstream,我想知道我的程序确定一个文件是否被追加或完全更改的最佳方法 我目前所做的是使用我编写的LogIOThread,它使用FileInputStream.avail来检查文件是否已附加。如果是这样,我将附加到一个不可编辑的JTextArea(实际上是一个具有可变滚动特性的修改过的JTextArea)。我的最终目的是拥有一个自动滚动JTextArea,它基本上是滚动一个log4j输出的日志文件。现在这对我来说很有效。我想将其调整为非日志文件 我想添加到LogIOThread的是一个监视器,它将检查文件内

我想知道我的程序确定一个文件是否被追加或完全更改的最佳方法

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

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

我想,在我这么做的时候,我可能想让它更加健壮,以处理中间文件插入的第二个用例,比如属性文件更改。我想我可以让textArea做一个换行,如果我能确定一行是否发生了变化

我有一个使用Java6的要求(不是我自己设定的),所以一些新的nio FileWatcher对我没有好处。通知程序通常看起来事与愿违,因为我通过FileInputStream捕获附件。这也导致我对其他LIB(如Commons和jnotify)打折。我可能错了,也许FileInputStream.avail对我来说不再是最好的方式了

我的第一个想法是,我可以存储文件大小,并检查它是否发生了急剧变化(值小于存储的值)。因为一个新创建的日志文件需要一个新的文本区域,这看起来并不坏,解决了我的第一个用例。这不适用于文件中特定值更改的第二个用例。当我的IOThread处于睡眠状态时,以一致大小重新创建的文件也可能会出现问题,尽管我怀疑这是否可能

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


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

如果文件大小减小,它肯定会被覆盖。然而,它也可能被同样大或更大的东西覆盖,因此反之不成立


不要将available()用作File.length()的代理项。请参阅Javadoc。这不是它的目的。

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

我同意这两个观点。我想我已经抛弃了文件大小的减少,因为它可以满足两个用例——事实上,我看到它不能满足两个用例。。。我使用available检查附加文本(而不是更改或长度)。这仍然不恰当,还是有更好的方法来检查FileInputStream中的附加文本?@user837631是的,我已经在回答中提到过。available()告诉您在不阻塞的情况下可以读取多少字节。它与输入的总长度没有必要的关系。@EJP您是说使用File.length()-last length读取自上次检查以来追加的下一个字节数?(代替使用available())