Spec-Zone .ru
спецификации, руководства, описания, API
|
Определение метаданных является "данными о других данных." С файловой системой данные содержатся в его файлах и каталогах, и метаданные отслеживают информацию о каждом из этих объектов: действительно ли это - регулярный файл, каталог, или ссылка? Каков ее размер, дата создания, последняя измененная дата, владелец файла, групповой владелец, и права доступа?
Метаданные файловой системы обычно упоминаются как его атрибуты файла. Files
class включает методы, которые могут использоваться, чтобы получить единственный атрибут файла, или установить атрибут.
Методы | Комментарий |
---|---|
size(Path) |
Возвращает размер указанного файла в байтах. |
isDirectory(Path, LinkOption) |
Возвращает true если указанное Path определяет местоположение файла, который является каталогом. |
isRegularFile(Path, LinkOption...) |
Возвращает true если указанное Path определяет местоположение файла, который является регулярным файлом. |
isSymbolicLink(Path) |
Возвращает true если указанное Path определяет местоположение файла, который является символьной ссылкой. |
isHidden(Path) |
Возвращает true если указанное Path определяет местоположение файла, который считают скрытым файловой системой. |
getLastModifiedTime(Path, LinkOption...) setLastModifiedTime(Path, FileTime) |
Возвраты или наборы прошлое измененное время указанного файла. |
getOwner(Path, LinkOption...) setOwner(Path, UserPrincipal) |
Возвраты или наборы владелец файла. |
getPosixFilePermissions(Path, LinkOption...) setPosixFilePermissions(Path, Set<PosixFilePermission>) |
Возвраты или наборы полномочия файла POSIX файла. |
getAttribute(Path, String, LinkOption...) setAttribute(Path, String, Object, LinkOption...) |
Возвраты или наборы значение атрибута файла. |
Если программа нуждается в многократных атрибутах файла в то же самое время, это может быть неэффективно, чтобы использовать методы, которые получают единственный атрибут. Неоднократно доступ к файловой системе, чтобы получить единственный атрибут может оказать негативное влияние на производительность. Поэтому Files
class обеспечивает два readAttributes
методы, чтобы выбрать атрибуты файла в одной объемной работе.
Метод | Комментарий |
---|---|
readAttributes(Path, String, LinkOption...) |
Читает атрибуты файла как объемную работу. String параметр идентифицирует атрибуты, которые будут считаны. |
readAttributes(Path, Class<A>, LinkOption...) |
Читает атрибуты файла как объемную работу. Class<A> параметр является типом атрибутов, которые требуют, и метод возвращает объект того class. |
Прежде, чем показать примеры readAttributes
методы, нужно упомянуть, что у различных файловых систем есть различные понятия, о которых должны быть прослежены атрибуты. Поэтому связанные атрибуты файла группируются в представления. Представление отображается на определенную реализацию файловой системы, такую как POSIX или DOS, или к общей функциональности, такой как принадлежность файла.
Поддерживаемые представления следующие:
BasicFileAttributeView
DosFileAttributeView
PosixFileAttributeView
FileOwnerAttributeView
AclFileAttributeView
UserDefinedFileAttributeView
Определенная реализация файловой системы могла бы поддерживать только основное представление атрибута файла, или это может поддерживать несколько из этих представлений атрибута файла. Реализация файловой системы могла бы поддерживать другие представления атрибута, не включенные в этот API.
В большинстве экземпляров Вам не придется иметь дело непосредственно ни с одним из FileAttributeView
интерфейсы. (Если Вы действительно должны работать непосредственно с FileAttributeView
, можно получить доступ к этому через getFileAttributeView(Path, Class<V>, LinkOption...)
readAttributes
методы используют обобщения и могут использоваться, чтобы считать атрибуты для любого из представлений атрибутов файла. Примеры в остальной части этой страницы используют readAttributes
методы.
Остаток от этого раздела затрагивает следующие темы:
Как упомянуто ранее, чтобы считать основные атрибуты файла, можно использовать один из Files.readAttributes
методы, который читает все основные атрибуты в одной объемной работе. Это намного более эффективно чем доступ к файловой системе отдельно, чтобы считать каждый отдельный атрибут. varargs параметр в настоящий момент поддерживает LinkOption
NOFOLLOW_LINKS
. Используйте эту опцию, когда Вы не хотите, чтобы символьные ссылки сопровождались.
creationTime
, lastModifiedTime
, и lastAccessTime
. Любая из этих меток времени не могла бы поддерживаться в определенной реализации, когда соответствующий метод средства доступа возвращает специфичное для реализации значение. Когда поддерживающийся, метка времени возвращается как FileTime
Следующий фрагмент кода читает и печатает основные атрибуты файла для данного файла и использует методы в BasicFileAttributes
Path file = ...; BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class); System.out.println("creationTime: " + attr.creationTime()); System.out.println("lastAccessTime: " + attr.lastAccessTime()); System.out.println("lastModifiedTime: " + attr.lastModifiedTime()); System.out.println("isDirectory: " + attr.isDirectory()); System.out.println("isOther: " + attr.isOther()); System.out.println("isRegularFile: " + attr.isRegularFile()); System.out.println("isSymbolicLink: " + attr.isSymbolicLink()); System.out.println("size: " + attr.size());
В дополнение к методам средства доступа, показанным в этом примере, есть a fileKey
метод, который возвращает или объект, который однозначно определяет файл или null
если никакой ключ файла не доступен.
Следующий фрагмент кода устанавливает в прошлый измененный раз в миллисекундах:
Path file = ...; BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class); long currentTime = System.currentTimeMillis(); FileTime ft = FileTime.fromMillis(currentTime); Files.setLastModifiedTime(file, ft); }
Атрибуты файла DOS также поддерживаются на файловых системах кроме DOS, таких как Samba. Следующий отрывок использует методы DosFileAttributes
Path file = ...; try { DosFileAttributes attr = Files.readAttributes(file, DosFileAttributes.class); System.out.println("isReadOnly is " + attr.isReadOnly()); System.out.println("isHidden is " + attr.isHidden()); System.out.println("isArchive is " + attr.isArchive()); System.out.println("isSystem is " + attr.isSystem()); } catch (UnsupportedOperationException x) { System.err.println("DOS file" + " attributes not supported:" + x); }
Однако, можно установить атрибут DOS, используя setAttribute(Path, String, Object, LinkOption...)
Path file = ...; Files.setAttribute(file, "dos:hidden", true);
POSIX является акронимом для Интерфейса Переносимой информационной системы для UNIX и является рядом IEEE и стандартов ISO, разработанных, чтобы гарантировать функциональную совместимость среди различных разновидностей UNIX. Если программа соответствует этим стандартам POSIX, она должна быть легко портирована на другие совместимые POSIX операционные системы.
Помимо владельца файла и группового владельца, POSIX поддерживает девять полномочий файла: считайте, запишите, и выполните полномочия для владельца файла, элементов той же самой группы, и "всех остальных."
Следующий фрагмент кода читает атрибуты файла POSIX для данного файла и печатает их к стандартному выводу. Код использует методы в PosixFileAttributes
Path file = ...; PosixFileAttributes attr = Files.readAttributes(file, PosixFileAttributes.class); System.out.format("%s %s %s%n", attr.owner().getName, attr.group().getName(), PosixFilePermissions.toString(attr.permissions()));
PosixFilePermissions
toString
метод, используемый в предыдущем фрагменте кода, преобразовывает полномочия файла в строку (например, rw-r--r--
).fromString
метод принимает строку, представляющую полномочия файла, и создает a Set
из полномочий файла.asFileAttribute
метод принимает a Set
из полномочий файла и конструкций атрибут файла, который можно передать к Path.createFile
или Path.createDirectory
метод.Следующий фрагмент кода читает атрибуты из одного файла и создает новый файл, присваивая атрибуты от исходного файла до нового файла:
Path sourceFile = ...; Path newFile = ...; PosixFileAttributes attrs = Files.readAttributes(sourceFile, PosixFileAttributes.class); FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(attrs.permissions()); Files.createFile(file, attr);
asFileAttribute
метод обертывает полномочия как a FileAttribute
. Код тогда пытается создать новый файл с теми полномочиями. Отметьте что umask
также применяется, таким образом, новый файл мог бы быть более безопасным чем полномочия, которые требовали.
Чтобы установить полномочия файла в значения, представленные как трудно кодированная строка, можно использовать следующий код:
Path file = ...; Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-------"); FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); Files.setPosixFilePermissions(file, perms);
пример рекурсивно изменяет полномочия файлов способом, подобным Chmod
chmod
утилита.
Чтобы преобразовать имя в объект, можно сохранить как владелец файла или групповой владелец, можно использовать UserPrincipalLookupService
служба. Эта служба ищет имя или название группы как строка и возвращает a UserPrincipal
объект, представляющий ту строку. Можно получить пользовательскую службу поиска принципала для файловой системы значения по умолчанию при использовании FileSystem.getUserPrincipalLookupService
Следующий фрагмент кода показывает, как установить владельца файла при использовании setOwner
метод:
Path file = ...; UserPrincipal owner = file.GetFileSystem().getUserPrincipalLookupService() .lookupPrincipalByName("sally"); Files.setOwner(file, owner);
Нет никакого метода специального назначения в Files
class для того, чтобы установить группового владельца. Однако, безопасный способ сделать так непосредственно посредством представления атрибута файла POSIX, следующим образом:
Path file = ...; GroupPrincipal group = file.getFileSystem().getUserPrincipalLookupService() .lookupPrincipalByGroupName("green"); Files.getFileAttributeView(file, PosixFileAttributeView.class) .setGroup(group);
Если атрибуты файла, поддерживаемые Вашей реализацией файловой системы, не достаточны для Ваших потребностей, можно использовать UserDefinedAttributeView
создать и отследить Ваши собственные атрибуты файла.
Некоторые реализации отображают это понятие на функции как Потоки данных Альтернативы NTFS и расширенные атрибуты на файловых системах, таких как ext3 и ZF. Большинство реализаций вводит ограничения для размера значения, например, ext3 ограничивает размер 4 килобайтами.
Тип MIME файла может быть сохранен как определяемый пользователем атрибут при использовании этого фрагмента кода:
Path file = ...; UserDefinedFileAttributeView view = Files .getFileAttributeView(file, UserDefinedFileAttributeView.class); view.write("user.mimetype", Charset.defaultCharset().encode("text/html");
Чтобы считать атрибут типа MIME, Вы использовали бы этот фрагмент кода:
Path file = ...; UserDefinedFileAttributeView view = file .getFileAttributeView(UserDefinedFileAttributeView.class); String name = "user.mimetype"; ByteBuffer buf = ByteBuffer.allocate(view.size(name)); view.read(name, buf); buf.flip(); String value = Charset.defaultCharset().decode(buf).toString();
шоу в качестве примера, как добраться, устанавливали, и удаляют определяемый пользователем атрибут.Xdd
UnsupportedOperationException
пытаясь получить доступ к определяемому пользователем представлению атрибута, Вы должны повторно смонтировать файловую систему. Следующая команда повторно монтирует корневой раздел с расширенными атрибутами для ext3 файловой системы. Если эта команда не работает на Вашу разновидность Linux, консультируйтесь с документацией. $ sudo mount -o remount,user_xattr /
Если Вы хотите делать изменение постоянным, добавьте запись в /etc/fstab
.
Можно использовать FileStore
class, чтобы изучить информацию о хранилище файлов, такой как, сколько пространства доступно. getFileStore(Path)
Следующий фрагмент кода печатает использование пространства для хранилища файлов, где определенный файл находится:
Path file = ...; FileStore store = Files.getFileStore(file); long total = store.getTotalSpace() / 1024; long used = (store.getTotalSpace() - store.getUnallocatedSpace()) / 1024; long avail = store.getUsableSpace() / 1024;
DiskUsage
пример использует этот API, чтобы напечатать информацию о дисковом пространстве для всех хранилищ в файловой системе значения по умолчанию. Этот пример использует getFileStores
FileSystem
class, чтобы выбрать все хранилища файлов для файловая система.