2016-11-10 3 views
0

У меня есть приложение Java с большим количеством NIO методов, такими как Files.copy, Files.move, Files.delete, FileChannel ...WebDAV FileSystemProvider - Java NIO

То, что я сейчас пытаюсь достичь: Я хочу получить доступ к удаленному серверу WebDAV и изменять данные на этом сервере с такими основными функциями, как загрузка, удаление или обновление удаленных данных WebDAV - без изменения каждого метода в моем приложении. Итак, вот моя идея:

Я думаю, что реализация WebDAV FileSystem сделала бы трюк. Добавление настраиваемого WebDAV FileSystemProvider, который управляет упомянутыми файловыми операциями на удаленных данных. Я много googled, и Apache VFS с реализацией Sardine выглядит хорошо - НО кажется, что Apache VFS несовместим с NIO?

Вот пример кода, как я представляю себе:

public class WebDAVManagerTest { 

private static DefaultFileSystemManager fsManager; 

private static WebdavFileObject testFile1; 
private static WebdavFileObject testFile2; 

private static FileSystem webDAVFileSystem1; 
private static FileSystem webDAVFileSystem2; 

@Before 
public static void initWebDAVFileSystem(String webDAVServerURL) throws FileSystemException, org.apache.commons.vfs2.FileSystemException { 

    try { 
      fsManager = new DefaultFileSystemManager(); 
      fsManager.addProvider("webdav", new WebdavFileProvider()); 
      fsManager.addProvider("file", new DefaultLocalFileProvider()); 
      fsManager.init(); 
     } catch (org.apache.commons.vfs2.FileSystemException e) { 
     throw new FileSystemException("Exception initializing DefaultFileSystemManager: " + e.getMessage()); 
     } 

    String exampleRemoteFile1 = "/foo/bar1.txt"; 
    String exampleRemoteFile2 = "/foo/bar2.txt"; 

    testFile1 = (WebdavFileObject) fsManager.resolveFile(webDAVServerURL + exampleRemoteFile1); 
    webDAVFileSystem1 = (FileSystem) fsManager.createFileSystem(testFile1); 
    Path localPath1 = webDAVFileSystem1.getPath(testFile1.toString()); 

    testFile2 = (WebdavFileObject) fsManager.resolveFile(webDAVServerURL + exampleRemoteFile2); 
    webDAVFileSystem2 = (FileSystem) fsManager.createFileSystem(testFile2); 
    Path localPath2 = webDAVFileSystem1.getPath(testFile1.toString()); 

    } 
} 

После этого я хочу работать в моем приложении с localPath1 + localPath2. Так, например, файл Files.copy (localPath1, newRemotePath) скопирует файл на сервере WebDAV в новый каталог.

Действительно ли это правильный курс? Или есть другие библиотеки для достижения этого?

ответ

1

Apache VFS использует собственный интерфейс FileSystem, а не NIO. У вас есть три варианта с различными уровнями усилий.

  1. Измените свой код, чтобы использовать существующий проект webdav, который использует собственную файловую систему, то есть Apache VFS.
  2. Найти существующий проект, который использует webdav и реализует NIO FileSystem и т. Д.
  3. Внедрите интерфейс NIO FileSystem самостоятельно.

Вариант 3 уже сделано, так что вы можете быть в состоянии настроить то, что кто-то уже написал, посмотрите на nio-fs-provider или nio-fs-webdav. Я уверен, что есть другие, но эти два легко найти с помощью Google.

Реализация WebDav NIO FileSystem с нуля было бы довольно много работы, так что я бы не рекомендовал начать там, я бы, вероятно, принять то, что кто-то сделал, и сделать эту работу для меня например, вариант 2.

Смежные вопросы