Виртуальная файловая система Apache Commons VFS

Для упрощения работы и гибкой возможности расширения функциональных возможностей файлового менеджера не будем ограничиваться прямым доступом к файлам операционной системы. Чтобы унифицировать доступ к файловым ресурсам, воспользуемся готовыми библиотеками свободного проекта виртуальной файловой системы Apache Commons Virtual File System (VFS). Целью данного проекта является создание единого интерфейса (application programming interface — API) для доступа к файловым ресурсам, будь то файлы на локальных дисках, на FTP-серверах или содержимое архивов — например, ZIP.

Поддерживаемые файловые системы


Текущая реализация Apache Commons VFS включает поддержку нескольких типов файловых систем и позволяет создавать собственные реализации с возможностью автоматического подключения. Все ресурсы идентифицируются при помощи единообразного идентификатора ресурсов (Uniform Resource Identifier — URI). URI позволяют описывать как абсолютные (пример: httр://www.berdaflex.com ), так и относительные (пример: ../images/logo.png ) ресурсы. Тип ресурса определяется на основе содержимого URI.


Рис. 1. Упрощенная UML диаграмма классов поддерживаемых файловых систем

Локальные файлы

Позволяет осуществлять доступ к локальным файлам файловой системы текущей операционной системы (ОС).

Формат URI

[file://] абсолютный путь
где "абсолютный путь" представляет собой допустимый путь к файлам текущей ОС в соответствии с универсальным соглашением об именовании ресурсов (Universal Naming Convention — UNC).

Примеры
file:///home/someuser/somedir
file://C:/Documents and Settings
c:/program files

Архивы Zip, Jar и Tar

Позволяет осуществлять (только чтение) доступ к содержимому архивов данных типов.

Формат URI
Тип_архива:// arch-file-uri[! абсолютный путь]
Где "тип_архива" может быть (zip, jar, tar, tgz, tbz2), а arch-file-uri указывает на файлы поддерживаемых типов. При необходимости использовать символ "!" нужно указывать код %21. Архивы tgz и tbz2 могут прописываться как tar:gz и tar:bz2 соответственно.

Примеры
jar:../lib/classes.jar!/META-INF/manifest.mf
zip: http://somehost/downloads/somefile.zip
tgz:file://anyhost/dir/mytar.tgz!/somepath/somefile

Архивы gzip и bzip2

Позволяет осуществлять (только чтение) доступ к содержимому архивов данных типов.

Формат URI
Тип_архива:// compressed-file-uri
Где "тип_архива" может быть (gz, bz2), а "compressed-file-uri" указывает на файлы поддерживаемых типов.

Пример
gz:/my/gz/file.gz

HTTP и HTTPS

Позволяет осуществлять доступ к файлам HTTP-сервера по обычному или защищенному протоколу.

Формат URI
http://[ username[: password]@] hostname[: port][ absolute-path]
https://[ username[: password]@] hostname[: port][ absolute-path]

Примеры
http://www.berdaflex.com/ru/default.html
https://sourceforge.net/projects/filearranger

FTP и SFTP

Позволяет осуществлять доступ к файлам FTP-сервера, по обычному или защищенному протоколу (SSH или SCP).

Формат URI
ftp://[ username[: password]@] hostname[: port][ absolute-path]
s ftp://[ username[: password]@] hostname[: port][ absolute-path]

Примеры
ftp://berdachuk:123@berdaflex.com/downloads/filearranger.zip
s ftp://berdachuk:123@berdaflex.com/downloads/filearranger.zip

WebDAV

Позволяет осуществлять доступ к файлам WebDAV-сервера.

Формат URI
webdav://[ username[: password]@] hostname[: port][ absolute-path]

Пример
webdav://somehost:8080/dist

CIFS

Позволяет осуществлять доступ к файлам CIFS-сервера — например, Samba-сервер или Windows share.

Формат URI
smb://[ username[: password]@] hostname[: port][ absolute-path]

Пример
smb://somehost/home

Временные файлы

Позволяет осуществлять доступ к временным файлам ОС, которые удаляются после работы с Commons VFS.

Формат URI
tmp://[ absolute-path]

Пример
tmp://dir/somefile.txt

res

Позволяет осуществлять доступ к виртуальному представлению файлов ресурсов в виде файловой системы.

Формат URI
res://[ path]

Пример
res:path/in/classpath/image.png
может заменить например:
jar:file://my/path/to/images.jar!/path/in/classpath/image.png

ram

Позволяет осуществлять доступ к виртуальной файловой системе в оперативной памяти. Обычно используется для временных файлов при выполнении многоступенчатых операций.

Формат URI
ram://[ path]

Пример
ram:///any/path/to/file.txt

Основы работы с VFS

Проще всего получить доступ к менеджеру VFS через статический метод VFS.getManager(), а с помощью VFS менеджера можно получить доступ непосредственно к файловым объектам, например:
//Печать содержимого каталога пользователя
FileSystemManager fsManager = VFS.getManager();
FileObject file = fsManager.resolveFile(System.getProperty("user.dir"));
FileObject[] children = jarFile.getChildren();
for ( int i = 0; i < children.length; i++ )
{
System.out.print( children[i].getName().getBaseName() );
FileContent content = children[i].getContent();
System.out.print(" Size: " + content.getSize() + " bytes.");
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
String lastMod = dateFormat.format(new Date(content.getLastModifiedTime()));
System.out.println("Last modified: " + lastMod);
}

Аутентификация пользователя

При работе с некоторыми ресурсами (например, FTP) требуется аутентификация пользователя.
Используя UserAutentificator, можно скрыть передаваемый в адресе пароль, например:
StaticUserAuthenticator auth =
new StaticUserAuthenticator("berdachuk", "password", null);
FileSystemOptions opts = new FileSystemOptions();
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
FileObject fo =
VFS.getManager().resolveFile("ftр://filearranger.com/downloads", opts);

Рекомендуемые ресурсы

Сайт проекта Apache Commons VFS: сайт
Сайт проекта File arranger: сайт

Сергей Бердачук


Компьютерная газета. Статья была опубликована в номере 34 за 2006 год в рубрике программирование

©1997-2024 Компьютерная газета