Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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-File lastModified vs读取文件_Java_File - Fatal编程技术网

java-File lastModified vs读取文件

java-File lastModified vs读取文件,java,file,Java,File,我正在使用一个文件,需要在修改文件时更新java中的值。 因此,我想使用File类的lastModified检查修改的时间,如果修改了,则读取文件并从文件中更新单个属性 我的疑问是,lastModified是否与从文件中读取单个属性/读取整个文件一样重。因为我的测试结果显示了几乎相同的结果 所以,从长远来看,每次从文件中读取文件并更新属性还是选中lastModified更好 注意:此操作每一分钟执行一次 或者,有没有比轮询lastModified更好的选项来检查文件是否已更改。我正在使用Java

我正在使用一个文件,需要在修改文件时更新java中的值。 因此,我想使用
File
类的
lastModified
检查修改的时间,如果修改了,则读取文件并从文件中更新单个属性

我的疑问是,
lastModified
是否与从文件中读取单个属性/读取整个文件一样重。因为我的测试结果显示了几乎相同的结果

所以,从长远来看,每次从文件中读取文件并更新属性还是选中
lastModified
更好

注意:此操作每一分钟执行一次

或者,有没有比轮询lastModified更好的选项来检查文件是否已更改。我正在使用Java6。

引用

要实现此功能(称为文件更改通知),程序必须能够检测文件系统上的相关目录发生了什么。一种方法是轮询文件系统以查找更改,但这种方法效率低下。它不能扩展到有数百个打开的文件或目录要监视的应用程序

file包提供了一个文件更改通知API,称为监视服务API。此API允许您向watch服务注册一个或多个目录。注册时,您会告诉服务您感兴趣的事件类型:文件创建、文件删除或文件修改。当服务检测到感兴趣的事件时,它被转发到已注册的进程。注册的进程有一个线程(或线程池),专门用于监视它注册的任何事件。当事件发生时,会根据需要进行处理`

以下是一些链接,提供了有关此服务实现的一些示例源:-


编辑:-感谢Kevin Day在评论中指出,因为您使用的是java 6,所以这可能不适合您。尽管在中有一种替代方案。但是,你没有检查过它,所以你必须自己检查:

< p>因为你使用java 6,检查修改的日期或文件内容是你唯一的选择(还有另一个答案,讨论使用更新的java. No.file功能,如果你有选择移动到java 7,你应该真的真的考虑到)。 要回答您原来的问题:

您没有指定文件的位置(即,它是在本地磁盘上还是在其他地方的服务器上)-我将假设使用本地磁盘进行响应,但如果文件位于不同的计算机上,则网络延迟和netbios/dfs/您使用的任何网络文件系统都会加剧差异

检查文件上的修改日期涉及从磁盘读取元数据。检查文件内容需要从磁盘读取文件内容(如果文件较小,这将是一次读取操作。如果文件较大,则可能是多次读取操作)

读取文件内容可能涉及读/写锁检查。一般来说,检查文件上的修改日期不需要读/写锁检查(根据文件系统的不同,元数据磁盘页上可能仍然存在一致性锁,但这些锁通常比文件锁轻)

如果文件经常更改(即,您实际上希望它每分钟都更改一次),那么检查修改的日期只是开销——在大多数情况下,您还是要读取文件内容。如果文件不经常更改,那么修改日期检查文件是否很大肯定会有好处(而且您必须阅读整个文件才能获得信息)

如果文件很小,并且不经常更改,那么它就相当于一次清洗。在大多数情况下,文件内容和文件元数据已经被分页到RAM中,因此这两种操作都是对RAM中内容的相对有效的检查

我个人会做修改的日期检查,只是b/c,这在逻辑上是有意义的(如果文件大小超过一个磁盘页,它可以保护您不受性能的影响),但是如果文件经常更改,那么我只会读取文件内容。但事实上,两种方式都可以


这就给了我们一个不请自来的建议:我的猜测是,在更大的范围内,这次行动的表现并不是什么大问题。即使花费的时间比现在长1000倍,也可能不会影响应用程序的主要用途/性能。因此,我真正的建议是编写代码并继续前进——不要担心它的性能,除非这会成为应用程序的瓶颈。

Ohh是的,没有做到这一点。我曾经使用过这个东西,它就像一个魔咒,只需要在java提供的代码中修改目录路径和监视参数。持续轮询文件系统并检查lastmodified似乎有点琐碎。还有一种替代方法是使用
ORG.APACHE.COMMONS IO
类,但尚未使用它们。我还没有检查代码,但我猜org.apache.commons.io会回到Java6下的轮询。除非apache正在部署本机库(值得怀疑),否则就不可能连接到文件系统通知系统。。。使用commons.io这样的库的好处在于它很好地封装了轮询——但实际上,这类东西只需要3到4行代码,而且非常容易实现即席轮询。