Java.nio.fichier.Chemin D'accès pour les URL?

Java7 est livré avec une implémentation par défaut Path pour les fichiers locaux. Existe-t-il une implémentation de chemin pour les URL?

Par exemple, je devrais pouvoir copier une ressource distante en utilisant le code suivant:

Path remote = Paths.get(new URI("http://www.example.com/foo/bar.html"));
Path local = Paths.get(new URI("/bar.html"));
Files.copy(remote, local);

Actuellement, cela lance java.nio.file.FileSystemNotFoundException: Provider "http" not installed. Je pourrais probablement l'implémenter moi-même, mais je préfère ne pas réinventer la roue.

27
demandé sur Gili 2012-01-09 07:09:38

2 réponses

Il semble que ce que vous essayez vraiment de faire est d'accomplir ce que FTP fait-copier des fichiers d'un endroit à un autre. Je vous suggère de trouver de meilleures façons de le faire avec les bibliothèques de code FTP existantes.

Les URI ne sont pas des chemins d'accès au système de fichiers, vous ne pouvez donc pas les traiter comme tels. Ce sont des adresses/localisateurs de ressources qui, lorsque vous y allez avec votre navigateur (ou un autre client qui les gère), déclenchent une action telle que définie par le serveur qui est derrière eux. Il n'y a pas de norme pour quoi ce serveur le fait, d'où la flexibilité des services web. Par conséquent, si votre serveur accepte les requêtes HTTP de cette manière pour faciliter les copies de fichiers, vous devrez lancer les vôtres et transmettre les données du fichier dans une requête POST.

Pour le dire autrement, (1) Ne traitez pas les URI comme s'ils étaient des chemins d'accès au système de fichiers - ils ne le sont pas, (2) Trouvez une bibliothèque FTP pour copier des fichiers, et / ou (3) Si vous voulez vraiment créer un service web qui le fait, abstraites les détails de la copie du fichier via un Requête POST. Si vous faites #3 comprendre que ce que votre bâtiment est assez proche de la coutume, et qu'il ne fonctionnera probablement que sur un sous-ensemble de sites qui suivent votre conception particulière (c'est-à-dire ceux que vous construisez vous-même). Il n'y a pas d'ensemble standard de paramètres ou de "copie de fichier" via la commande POST dont je suis conscient que vous pouvez tirer parti pour que cela fonctionne - vous devrez faire correspondre votre requête HTTP avec le service web côté serveur.

3
répondu jefflunt 2014-02-22 17:41:11

J'ai dû faire face à un problème similaire et j'ai écrit une petite méthode pour résoudre ce problème, vous pouvez trouver ci-dessous.

Cela fonctionne bien pour la concaténation de L'URL et des suffixes relatifs. Veillez à ne pas donner de suffixe absolu en raison du comportement de la fonction de résolution D'URI.

private URI resolveURI(String root, String suffix) {
    URI uri;
    try {
        uri = new URI(root + "/").resolve(suffix);
    } catch (URISyntaxException e) {
        //log
    }
    return uri;
}
0
répondu sanver 2017-11-23 15:33:25