2016-11-10 4 views
0

ich mit vielen NIO Methoden wie Files.copy eine Java-Anwendung haben, Files.move, Files.delete, FileChannel ...WebDAV FileSystemProvider - Java NIO

Was ich jetzt zu erreichen versuchen: Ich möchte einen Remote-WebDAV-Server zugreifen und diese ändern Daten auf diesem Server mit den grundlegenden Funktionen wie Upload, Löschen oder Aktualisieren der Remote-WebDAV-Daten - ohne jede Methode in meiner Anwendung zu ändern. Also hier kommt meine Idee:

Ich denke, eine WebDAV FileSystem-Implementierung würde den Trick tun. Hinzufügen eines benutzerdefinierten WebDAV-FileSystemProvider, der die genannten Dateioperationen auf den Remote-Daten verwaltet. Ich habe viel gegooglet und das Apache VFS mit Sardine-Implementierung sieht gut aus - ABER es scheint, dass das Apache VFS nicht mit NIO kompatibel ist?

Hier einige Beispiel-Code, wie ich es mir vorstelle:

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()); 

    } 
} 

Danach habe ich mit localPath1 + localPath2 in meiner Anwendung arbeiten möchten. So dass z.B. Eine Files.copy (localPath1, newRemotePath) würde eine Datei auf dem WebDAV-Server in ein neues Verzeichnis kopieren.

Ist dies die richtige Vorgehensweise? Oder gibt es andere Bibliotheken, um das zu erreichen?

Antwort

1

Apache VFS verwendet eine eigene FileSystem-Schnittstelle, nicht die NIO-Schnittstelle. Sie haben drei Möglichkeiten mit unterschiedlichem Aufwand.

  1. Ändern Sie Ihren Code, um ein vorhandenes Webdav-Projekt zu verwenden, das ein eigenes FileSystem verwendet, z. B. Apache VFS.
  2. Suchen Sie ein vorhandenes Projekt, das webdav verwendet und NIO FileSystem usw. implementiert.
  3. Implementieren Sie die NIO FileSystem-Schnittstelle selbst.

Option 3 ist bereits getan worden, so Sie in der Lage sein können, anpassen, was jemand anderes bereits geschrieben hat, haben einen Blick auf nio-fs-provider oder nio-fs-webdav. Ich bin mir sicher, dass es andere gibt, aber diese beiden waren mit Google einfach zu finden.

ein WebDav NIO Filesystem von Grund auf neu implementieren wäre ziemlich viel Arbeit, so würde ich dort nicht empfehlen beginnen, würde ich wahrscheinlich das, was jemand getan hat, und dass die Arbeit machen für mich also Option 2.