Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Основной ввод-вывод
Раздел: Файловый ввод-вывод (Обладающий NIO.2)
Управление Метаданными (Хранилище файлов и Атрибуты Хранилища файлов)
Домашняя страница > Существенные Классы > Основной ввод-вывод

Управление Метаданными (Хранилище файлов и Атрибуты Хранилища файлов)

Определение метаданных является "данными о других данных." С файловой системой данные содержатся в его файлах и каталогах, и метаданные отслеживают информацию о каждом из этих объектов: действительно ли это - регулярный файл, каталог, или ссылка? Каков ее размер, дата создания, последняя измененная дата, владелец файла, групповой владелец, и права доступа?

Метаданные файловой системы обычно упоминаются как его атрибуты файла. 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, или к общей функциональности, такой как принадлежность файла.

Поддерживаемые представления следующие:

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

В большинстве экземпляров Вам не придется иметь дело непосредственно ни с одним из FileAttributeView интерфейсы. (Если Вы действительно должны работать непосредственно с FileAttributeView, можно получить доступ к этому через getFileAttributeView(Path, Class<V>, LinkOption...) метод.)

readAttributes методы используют обобщения и могут использоваться, чтобы считать атрибуты для любого из представлений атрибутов файла. Примеры в остальной части этой страницы используют readAttributes методы.

Остаток от этого раздела затрагивает следующие темы:

Основные Атрибуты файла

Как упомянуто ранее, чтобы считать основные атрибуты файла, можно использовать один из Files.readAttributes методы, который читает все основные атрибуты в одной объемной работе. Это намного более эффективно чем доступ к файловой системе отдельно, чтобы считать каждый отдельный атрибут. varargs параметр в настоящий момент поддерживает LinkOption перечисление, NOFOLLOW_LINKS. Используйте эту опцию, когда Вы не хотите, чтобы символьные ссылки сопровождались.


Слово о метках времени: набор основных атрибутов включает три метки времени: creationTime, lastModifiedTime, и lastAccessTime. Любая из этих меток времени не могла бы поддерживаться в определенной реализации, когда соответствующий метод средства доступа возвращает специфичное для реализации значение. Когда поддерживающийся, метка времени возвращается как FileTime объект.

Следующий фрагмент кода читает и печатает основные атрибуты файла для данного файла и использует методы в BasicFileAttributes class.

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 class.

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

POSIX является акронимом для Интерфейса Переносимой информационной системы для UNIX и является рядом IEEE и стандартов ISO, разработанных, чтобы гарантировать функциональную совместимость среди различных разновидностей UNIX. Если программа соответствует этим стандартам POSIX, она должна быть легко портирована на другие совместимые POSIX операционные системы.

Помимо владельца файла и группового владельца, POSIX поддерживает девять полномочий файла: считайте, запишите, и выполните полномочия для владельца файла, элементов той же самой группы, и "всех остальных."

Следующий фрагмент кода читает атрибуты файла POSIX для данного файла и печатает их к стандартному выводу. Код использует методы в PosixFileAttributes class.

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 помощник class обеспечивает несколько полезных методов, следующим образом:

Следующий фрагмент кода читает атрибуты из одного файла и создает новый файл, присваивая атрибуты от исходного файла до нового файла:

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 шоу в качестве примера, как добраться, устанавливали, и удаляют определяемый пользователем атрибут.


Отметьте: В Linux Вам, возможно, придется позволить расширенным атрибутам для определяемых пользователем атрибутов работать. Если Вы получаете 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, чтобы выбрать все хранилища файлов для файловая система.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Перемещение Файла или каталога
Следующая страница: Чтение, Запись, и Создание Файлов