Виртуальная файловая система 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: сайт
Сергей Бердачук
Поддерживаемые файловые системы
Текущая реализация 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 год в рубрике программирование