Для упрощения работы и гибкой возможности расширения функциональных возможностей файлового менеджера, не будем ограничиваться прямым доступом к файлам операционной системы. Чтобы унифицировать доступ к файловым ресурсам воспользуемся готовыми библиотеками свободного проекта виртуальной файловой системы Apache Commons Virtual File System (VFS). Целью данного проекта является создание единого интерфейса (application programming interface (API)) для доступа к файловым ресурсам независимо будь то файлы на локальных дисках, на ftp серверах или содержимое архивов, например ZIP.
Текущая реализация Apache Commons VFS включает поддержку нескольких типов файловых систем, и позволяет создавать собственные реализации с возможностью автоматического подключения. Все ресурсы идентифицируются при помощи единообразного идентификатора ресурсов (Uniform Resource Identifier (URI)). URI позволяют описывать, как абсолютные, (пример: http://www.berdaflex.com), так и относительные (пример: ../images/logo.png) ресурсы. Тип ресурса определяется на основе содержимого URI.
Позволяет осуществлять доступ к локальным файлам файловой системы текущей операционной системы (ОС).
Формат URI
[file://] абсолютный путь
Где “ абсолютный путь ” представляет собой допустимый путь к файлам текущей ОС в соответствии с универсальным соглашением об именовании ресурсов (Universal Naming Convention (UNC)).
Примеры
file:///home/someuser/somedir file://C:/Documents and Settings c:/program files
Позволяет осуществлять (только чтение) доступ к содержимому архивов данных типов.
Формат 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
Позволяет осуществлять (только чтение) доступ к содержимому архивов данных типов.
Формат URI
Тип_архива:// compressed-file-uri
Где " Тип_архива " может быть (gz, bz2), а " compressed-file-uri " указывает на файлы поддерживаемых типов.
Пример
gz:/my/gz/file.gz
Позволяет осуществлять доступ к файлам 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 сервера, по обычному или защищенному протоколу (SSH или SCP).
Формат URI
ftp://[ username[: password]@] hostname[: port][ absolute-path] sftp://[ username[: password]@] hostname[: port][ absolute-path]
Примеры
ftp://berdachuk:123@ berdaflex.com/downloads/filearranger.zip sftp://berdachuk:123@berdaflex.com/downloads/filearranger.zip
Позволяет осуществлять доступ к файлам WebDAV сервера.
Формат URI
webdav://[ username[: password]@] hostname[: port][ absolute-path]
Пример
webdav://somehost:8080/dist
Позволяет осуществлять доступ к файлам 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
Позволяет осуществлять доступ к виртуальному представлению файлов ресурсов в виде файловой системы.
Формат URI
res://[ path]
Пример
res:path/in/classpath/image.png может заменить например: jar:file://my/path/to/images.jar!/path/in/classpath/image.png
Позволяет осуществлять доступ к виртуальной файловой системе в оперативной памяти.
Обычно используется для временных файлов при выполнении многоступенчатых операций.
Формат URI
ram://[ path]
Пример
ram:///any/path/to/file.txt
Проще всего получить доступ к менеджеру 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("ftp://filearranger.com/downloads", opts);
Сайт проекта Apache Commons VFS: http://jakarta.apache.org/commons/vfs