2009-09-17 69 views
1

我运行一些测试来证明一个概念,我刚才写的代码,发现一个奇怪的情况:奇怪的差异

public class Test { 

public static void main(String[] args) { 

    Date now = new Date(); 

    File file = new File("/root/batch-experiments/test.txt"); 

    try { 
     file.createNewFile(); 
    } catch (IOException e) { 
     System.out.println("cannot create file..."); 
    } 

    System.out.println(MessageFormat.format("Checking File {0}! Last Modified time is {1}. Must be newer than {2}", file.getName(), 
      file.lastModified(), now.getTime())); 

    if (file.lastModified() >= now.getTime()) { 
     //ignore... 
    } else { 
     System.out.println(MessageFormat.format("File {0} is out of date and was ignored.", file)); 
    } 
} 

}

输出是:

Checking File test.txt! Last Modified time is 1,253,187,650,000. Must be newer than 1,253,187,650,496 
File /root/batch-experiments/test.txt is out of date and was ignored. 

怎么可能? 新日期时间之后不应该是文件修改时间吗? 这发生在4/5次尝试中。

我在这里错过了什么?

任何方式来保证新的日期()比文件创建旧?

+0

+1问题很有用,很好的解释。 – KLE 2009-09-17 12:08:34

回答

5

文件系统日期粒度通常为1秒(取决于实际的文件系统,也可能更差)。当您创建该文件时,创建时间将变为四舍五入。

0

也许编译器重新排序指令的执行方式?也许,如果你的真实意图不需要一毫秒或更高的精度,那么更准确的测试应该包括两个指令之间的一些睡眠时间。

2

上次修改的粒度可能小于毫秒。

2

我知道Date对象给出的毫秒数,但我们的机器上只有每15.5 ms。具体来说,在我们的日志模块中,我们看到日期之间的增量为:15ms,16ms,31ms,47ms ...

这可以解释至少15ms的差异。


除此之外,根据我的经验,文件操作不应该过分依赖精确的日期。我已经看到许多依赖项或最新检查器的实现,它们的容差大约为300ms到2s(对于远程文件更多)。所以他们认为如果一个依赖文件在后面或前面(但不超过300ms)是最新的。