Странная разница между новой датой () и датой создания файла - PullRequest
1 голос
/ 17 сентября 2009

Я провожу некоторый тест, чтобы доказать концепцию, и я просто написал этот код и обнаружил странную ситуацию:

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.

Как это возможно? Не должно ли быть время изменения файла после новой даты? Это происходит 1 в 4/5 попыток.

Что мне здесь не хватает?

Любой способ гарантировать, что новый Date () старше, чем создание файла?

Ответы [ 4 ]

5 голосов
/ 17 сентября 2009

Детализация даты файловой системы обычно составляет одну секунду (в зависимости от фактической файловой системы, это может также быть хуже). при создании файла время создания округляется.

2 голосов
/ 17 сентября 2009

Я знаю, что Объект Date дает миллисекунды, но только каждые 15,5 мс на наших машинах. В частности, в нашем модуле журнала мы видим разницу между датами: 15 мс, 16 мс, 31 мс, 47 мс ...

Это может объяснить разницу как минимум в 15 мс.


Кроме того, по моему опыту, файловые операции не должны слишком полагаться на точные даты. Я видел много реализаций зависимостей или современных контроллеров, которые имеют допуск от 300 мс до 2 с (и более для удаленных файлов). Поэтому они считают, что зависимый файл является современным, если он задний или передний (но не более 300 мс).

2 голосов
/ 17 сентября 2009

Степень детализации последнего изменения, вероятно, меньше, чем миллисекунды.

0 голосов
/ 17 сентября 2009

Может быть, компилятор изменил порядок выполнения инструкций?

Возможно, если ваши реальные намерения не нуждаются в точности до миллисекунды или выше, более точный тест должен включать некоторое время ожидания между обеими инструкциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...