Имитация сенсорной команды с Java - PullRequest
47 голосов
/ 10 сентября 2009

Я хочу изменить метку времени изменения двоичного файла. Каков наилучший способ сделать это?

Будет ли открытие и закрытие файла хорошим вариантом? (Мне требуется решение, в котором изменение метки времени будет меняться на каждой платформе и JVM).

Ответы [ 7 ]

44 голосов
/ 10 сентября 2009

Класс File имеет метод setLastModified . Это то, что делает ANT.

19 голосов
/ 02 сентября 2014

Мои 2 цента, на основании ответа @Joe.M

public static void touch(File file) throws IOException{
    long timestamp = System.currentTimeMillis();
    touch(file, timestamp);
}

public static void touch(File file, long timestamp) throws IOException{
    if (!file.exists()) {
       new FileOutputStream(file).close();
    }

    file.setLastModified(timestamp);
}
10 голосов
/ 30 марта 2013

Вот простой фрагмент:

void touch(File file, long timestamp)
{
    try
    {
        if (!file.exists())
            new FileOutputStream(file).close();
        file.setLastModified(timestamp);
    }
    catch (IOException e)
    {
    }
}
8 голосов
/ 10 сентября 2009

Я знаю В Apache Ant есть Задача , которая делает именно это.
См. исходный код Touch (который может показать вам, как они это делают)

Они используют FILE_UTILS.setFileLastModified(file, modTime);, который использует ResourceUtils.setLastModified(new FileResource(file), time);, который использует org.apache.tools.ant.types.resources.Touchable, реализованный org.apache.tools.ant.types.resources.FileResource ...

По сути, это вызов File.setLastModified(modTime).

6 голосов
/ 14 декабря 2015

Если вы уже используете Гуава :

com.google.common.io.Files.touch(file)

6 голосов
/ 24 июля 2013

В этом вопросе упоминается только обновление метки времени, но я все равно решил добавить это сюда. Я искал прикосновение, как в Unix, которое также создаст файл, если он не существует.

Для тех, кто использует Apache Commons, есть FileUtils.touch(File file), который делает именно это.

Вот источник из (встроенный openInputStream(File f)):

public static void touch(final File file) throws IOException {
    if (file.exists()) {
        if (file.isDirectory()) {
            throw new IOException("File '" + file + "' exists but is a directory");
        }
        if (file.canWrite() == false) {
            throw new IOException("File '" + file + "' cannot be written to");
        }
    } else {
        final File parent = file.getParentFile();
        if (parent != null) {
            if (!parent.mkdirs() && !parent.isDirectory()) {
                throw new IOException("Directory '" + parent + "' could not be created");
            }
        }
        final OutputStream out = new FileOutputStream(file);
        IOUtils.closeQuietly(out);
    }
    final boolean success = file.setLastModified(System.currentTimeMillis());
    if (!success) {
        throw new IOException("Unable to set the last modification time for " + file);
    }
}
3 голосов
/ 05 июня 2017

Поскольку File является плохой абстракцией , лучше использовать Files и Path:

public static void touch(final Path path) throws IOException {
    Objects.requireNotNull(path, "path is null");
    if (Files.exists(path)) {
        Files.setLastModifiedTime(path, FileTime.from(Instant.now()));
    } else {
        Files.createFile(path);
    }
}
...