Файл lastModified () метод в Java с примерами
Функция lastModified () является частью класса File в Java. Эта функция возвращает время, обозначенное этим абстрактным путем, в последний раз измененное. Функция возвращает длинное значение, измеренное в миллисекундах, представляющее время, когда файл был изменен в последний раз, в противном случае возвращает 0L, если файл не существует или возникает исключение.
Подпись функции:
Синтаксис:
Параметры: Этот метод не принимает никаких параметров.
Возвращаемый тип Эта функция возвращает длинный тип данных, представляющий время последнего изменения файла, или 0L, если файл не существует.
Исключение: этот метод генерирует исключение безопасности, если доступ на запись в файл запрещен
Ниже программы иллюстрируют использование функции lastModified ():
Пример 1. Файл «F: //program.txt» является существующим файлом в F: Directory.
// Java-программа для демонстрации
// lastModified () метод класса файла
public class solution <
public static void main(String args[])
File f = new File( «F:\\program.txt» );
// Получить время последнего изменения файла
System.out.println( «Last modified: «
Выход:
Пример 2: файл «F: //program1.txt» не существует
// Java-программа для демонстрации
// lastModified () метод класса файла
public class solution <
public static void main(String args[])
File f = new File( «F:\\program.txt» );
// Получить время последнего изменения файла
System.out.println( «Last modified: «
Выход:
Примечание. Программы могут не работать в онлайн-среде IDE. Пожалуйста, используйте автономную IDE и укажите путь к файлу.
Источник
Класс File
В отличие от большинства классов ввода/вывода, класс File работает не с потоками, а непосредственно с файлами. Данный класс позволяет получить информацию о файле: права доступа, время и дата создания, путь к каталогу. А также осуществлять навигацию по иерархиям подкаталогов.
Класс java.io.File может представлять имя определённого файла, а также имена группы файлов, находящихся в каталоге. Если класс представляет каталог, то его метод list() возвращает массив строк с именами всех файлов.
Для создания объектов класса File можно использовать один из следующих конструкторов.
- File(File dir, String name) — указывается объекта класса File (каталог) и имя файла
- File(String path) — указывается путь к файлу без указания имени файла
- File(String dirPath, Sring name) — указывается путь к файлу и имя файла
- File(URI uri) — указывается объекта URI, описывающий файл
Методы класса File
Класс File может использоваться для создания каталога или дерева каталогов. Также можно узнать свойства файлов (размер, дату последнего изменения, режим чтения/записи), определить к какому типу (файл или каталог) относится объект File, удалить файл. У класса очень много методов, перечислим некоторые.
- getAbsolutePath() — абсолютный путь файла, начиная с корня системы. В Android корневым элементом является символ слеша (/)
- canRead() — доступно для чтения
- canWrite() — доступно для записи
- exists() — файл существует или нет
- getName() — возвращает имя файла
- getParent() — возвращает имя родительского каталога
- getPath() — путь
- lastModified() — дата последнего изменения
- isFile() — объект является файлом, а не каталогом
- isDirectory — объект является каталогом
- isAbsolute() — возвращает true, если файл имеет абсолютный путь
- renameTo(File newPath) — переименовывает файл. В параметре указывается имя нового имени файла. Если переименование прошло неудачно, то возвращается false
- delete() — удаляет файл. Также можно удалить пустой каталог
Каталог
Каталог — это объект класса File, который содержит список других файлов и каталогов. После создания объекта класса File, являющего каталогом, его метод isDirectory() вернёт значение true. И тогда вы можете вызывать метод list().
Для создания каталога можно использовать метод mkdir(), который вернёт true в успешном случае. Если указанный путь уже существует или каталог нельзя создать из-за отсутствия полного пути к нему, то вернётся false.
Метод mkdirs() создаёт сам каталог, так и всех его родителей.
Список каталогов
Если вы хотите получить содержимое каталога, то можно вызвать метод list() без аргументов. Вам вернётся полный список (массив) имён файлов и каталогов, содержащихся в данном каталоге. Есть ещё похожий метод listFiles(), который возвращает массив файлов (объектов, а не их имён), о котором поговорим отдельно.
Если вам нужен только список файлов с расширением .java, то можно использовать специальный фильтр-класс, который описывает критерии отбора объектов File с помощью интерфейса FilenameFilter.
Интерфейс FilenameFilter определяет единственный метод accept(), вызываемый по одному разу с каждым файлом в списке.
Метод возвращает true для файлов каталога, указанного в dir, которые должны быть включены в список, и false — для файлов, которые следует исключить.
Метод listFiles()
Метод имеет несколько перегруженных версий. Он возвращает список файлов в виде массива объектов класса File. Одна из версий метода также использует интерфейс FilenameFilter. Другая версия использует интерфейс FileFilter и возвращает те файлы, путевые имена которых соответствует интерфейсу.
Пример использования методов класса File показан в уроке Файловый менеджер и в других примерах.
Источник
Создание удобного OpenFileDialog для Android
Наверное, как и многие разработчики под Android, столкнулся на днях с необходимостью реализовать в своем приложении выбор файла пользователем. Так как изначально в Android такого функционала нет, обратился к великому и ужасному. Это показалось мне странным, но из вороха вопросов на stackoverflow и небольшого числа отечественных форумов можно выделить всего три основных источника:
- Android File Dialog – почти все ссылки из stackoverflow ведут сюда. В принципе, неплохое решение, но реализовано через отдельную activity, а хотелось чего-то в духе OpenFileDialog’а из .Net.
- В данной статье речь идет вообще об отдельном файл-менеджере, и почерпнуть какие-то идеи из неё не удалось.
- Идея же отсюда очень понравилась, однако, как мне показалось реализовать все это можно несколько красивее.
В результате, начав реализовывать своё решение, я столкнулся с некоторыми трудностями решать которые показалось очень интересно. А посему, решил описать в данной статье не просто готовое решение, а все шаги, которые к нему привели. Желающие пройти их вместе –
Итак, приступим! В любой привычной среде (я использую IntelliJ IDEA) создадим новое приложение. На главной activity расположим одну единственную кнопку и напишем к ней, пока пустой, обработчик нажатия:
Создадим новый класс с конструктором:
а в обработчике кнопки вызовем диалог:
Кнопки показались, теперь надо бы и сами файлы найти. Начнем поиск с корня sdcard, для чего определим поле:
и реализуем следующий метод:
(так как главное требование к классу – работать сразу у любого разработчика, без подключения дополнительных библиотек, — то никаких google-collections использовать не будем, и с массивами приходится работать по старинке), а в конструкторе к вызову setNegativeButton добавим .setItems(getFiles(currentPath), null).
Что же, неплохо, однако файлы не отсортированы. Реализуем для этого дела Adapter как внутренний класс, заменим setItems на setAdapter и немного перепишем getFiles:
Еще лучше, но нам надо по клику на папке идти внутрь. Можно достучаться до встроенного listview, но я просто подменил его собственным (это потом пригодится). Плюс, изменения adapter’а внутри обработчика listview вызывало exception, и список файлов пришлось вынести в отдельное поле:
Отлично, вот только нажав на папку Android мы получаем список всего из одного каталога data, и наше окно тут же уменьшается в размере.
Возможно это нормально, но мне это не понравилось, и я стал искать возможности размер сохранить. Единственный найденный мною вариант – это установка setMinimumHeight. Установка этого свойства для listview вызвала дополнительные проблемы, но они решились оберткой его в LinearLayout:
Результат, все равно получился немного не таким, каким хотелось бы: при старте диалог развернут на весь экран, а после перехода в каталог Android – уменьшается до 750px. Да еще и экраны разных устройств имеют разную высоту. Решим сразу обе этих проблемы, установив setMinimumHeight в максимально возможную для текущего экрана:
Не нужно пугаться того, что мы устанавливаем в setMinimumHeight полный размер экрана, сама система уменьшит значение до максимально допустимого.
Теперь появляется проблема понимания пользователя, в каком каталоге он сейчас находится, и возврата вверх. Давайте разберемся с первой. Вроде все легко — установить значение title в currentPath и менять его при изменении последнего. Добавим в конструктор и в метод RebuildFiles вызов setTitle(currentPath).
А нет – заголовок не изменился. Почему не срабатывает setTitle после показа диалога, документация молчит. Однако мы может это исправить, создав свой заголовок и подменив им стандартный:
И снова не все ладно: если пройти достаточно далеко, то строка в заголовок влезать не будет
Решение с установкой setMaximumWidth не верно, так как пользователь будет видеть только начало длинного пути. Не знаю, насколько верно мое решение, но я сделал так:
Решим теперь проблему с возвратом. Это достаточно легко, учитывая, что у нас есть LinearLayout. Добавим в него еще один TextView и немного отрефракторим код:
Возможность возвращаться на шаг вверх, может привести пользователя в каталоги, к которым ему доступ запрещен, поэтому изменим функцию RebuildFiles:
(cообщение пока не очень информативное, но вскоре мы добавим разработчику возможность исправить это).
Ни один OpenFileDialog не обходится без фильтра. Добавим и его:
Обратите внимание — фильтр принимает регулярное выражение. Казалось бы – все хорошо, но первая выборка файлов сработает в конструкторе, до присвоения фильтра. Перенесем её в переопределенный метод show:
Осталось совсем чуть-чуть: вернуть выбранный файл. Опять же, я так и не понял зачем нужно устанавливать CHOICE_MODE_SINGLE, а потом все равно писать лишний код для подсветки выбранного элемента, когда он (код) и так будет работать без CHOICE_MODE_SINGLE, а потому обойдемся без него:
Источник
File.lastModified () никогда не был установлен с file.setLastModified ()
У меня проблема с набором миллисов и читается на Android 2.3.4 на Nexus One. Это код:
В этом небольшом тесте я пишу 1310198774, но результат, который возвращается из lastModified (), равен 1310199771000.
Даже если я сокращаю конечный «000», разница составляет несколько минут.
Мне нужно синхронизировать файлы между веб-сервисом и устройством Android. Минуты последней модификации являются частью данных, отправленных этой службой. Я устанавливаю миллионы для созданных / скопированных файлов и папок, чтобы проверить, нужно ли перезаписывать файл / папку.
Все работает, но миллионы, которые возвращаются из файловой системы, отличаются от значений, которые были установлены.
Я почти уверен, что что-то не так с моим кодом, но я не могу его найти.
Спасибо заранее. HJW
Так что, возможно, я что-то пропустил, но вижу некоторые проблемы с вашим кодом выше. Ваша конкретная проблема может быть вызвана (как указано в @JB) на проблемы с Android, но для потомков я думал, что дам ответ.
Во-первых, File.setLastModified() занимает время в миллисекундах. Вот javadocs . Кажется, вы пытаетесь установить его за считанные секунды. Таким образом, ваш код должен выглядеть примерно так:
Как упоминалось в javadocs, многие файловые системы поддерживают только секундную детализацию секунд для последнего времени модификации. Поэтому, если вам нужно увидеть такое же время модификации в файле, вы должны сделать что-то вроде следующего:
На Jelly Bean + он отличается (в основном, на устройствах Nexus еще и другими, которые используют новый слой плавкого предохранителя для эмуляции эмуляции / mnt / shell / emulated sdcard):
Это проблема разрешения VFS, syscall utimensat () терпит неудачу с EPERM из-за несоответствующих разрешений (например, права собственности).
В платформе / system / core / sdcard / sdcard.c:
/ * Все файлы, принадлежащие root.sdcard * /
Attr-> uid = 0;
Attr-> gid = AID_SDCARD_RW;
Из страницы syscall man utimensat ():
Old FAT предлагает переопределить флаг iattr-> valid с помощью опции mount, чтобы разрешить изменение временных меток кому-либо, FUSE + Android sdcard-FUSE не делает этого в данный момент (поэтому сбой inode_change_ok () завершается с ошибкой) и попытка Отклоняется с -EPERM. Вот FAT ./fs/fat/file.c:
Я также добавил эту информацию к этой открытой ошибке .
Если это не работает, попробуйте это (уродливое) обходное решение, указанное на https://code.google.com/p/android/issues/detail?id=18624 :
Работает на некоторых устройствах, но не на других. Не разрабатывайте решение, основанное на его работе. См. https://code.google.com/p/android/issues/detail?id=18624#c29.
Вот простой тест, чтобы узнать, работает ли он.
Если вы хотите изменить дату / время каталога на текущую дату / время (т. Е. «Сейчас»), вы можете создать в нем какой-то временный файл, записать в него что-то, а затем сразу же удалить его. Это приводит к изменению даты / времени ‘lastModified ()’ каталога до текущей даты / времени. Однако это не сработает, если вы хотите изменить дату / время каталога на какое-либо другое случайное значение и не можете быть применены к файлу, очевидно.
Источник