Имитация сенсорной команды с Java
Вопрос
Я хочу изменить метку времени изменения двоичного файла. Каков наилучший способ сделать это?
Было бы хорошим вариантом открыть и закрыть файл? (Мне требуется решение, в котором изменение метки времени будет изменяться на каждой платформе и JVM).
Решение
Класс File имеет setLastModified метод. Это то, что делает ANT.
Другие советы
Мои 2 цента, основанные на @ Joe.M answer
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);
}
Вот простой фрагмент:
void touch(File file, long timestamp)
{
try
{
if (!file.exists())
new FileOutputStream(file).close();
file.setLastModified(timestamp);
}
catch (IOException e)
{
}
}
Я знаю, что Apache Ant имеет Задача , которая делает именно это.
См. исходный код Touch (который может показать вам, как они это делают)
Они используют FILE_UTILS .setFileLastModified (file, modTime);
, который использует ResourceUtils.setLastModified (новый FileResource (файл), время);
, который использует org.apache.tools.ant.types.resources.Touchable
, реализовано < code> org.apache.tools.ant.types.resources.FileResource ...
По сути, это вызов File.setLastModified (modTime)
.
В этом вопросе упоминается только обновление метки времени, но я все равно решил добавить это сюда. Я искал прикосновение, как в Unix, которое также создаст файл, если он не существует.
Для тех, кто использует Apache Commons, есть FileUtils.touch (файл файла)
, который делает именно это.
Вот source from (встроенный openInputStream (файл 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);
}
}
Если вы уже используете гуаву :
<код> com.google.common.io.Files.touch (файл) код>
Поскольку Файл
является плохой абстракцией лучше использовать Файлы
и 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);
}
}