web-dev-qa-db-fra.com

Principes de base - lecture/écriture de fichiers distants avec Java

J'ai commencé avec l'exigence de lire et d'écrire des fichiers depuis/dans un répertoire sur une machine Ubuntu distante.

Tout d'abord, j'ai écrit un programme Java capable de lire et d'écrire des fichiers à partir d'un dossier partagé sur une machine Windows distante, c'est-à-dire sur un réseau local. Ici, quelque chose comme ceci fonctionne sur ma machine Windows (locale):

File inputFile = new File(
                "\\172.17.89.76\EBook PDF");/*ignore the syntax errors, the loc is just for the idea*/

Maintenant, quand je considère une machine Ubuntu distante, évidemment, je ne peux pas faire quelque chose comme ceci car la machine n’est pas sur le LAN ( Je ne suis pas sûr que cela puisse être fait même si elle est sur le LAN !) . J'ai donc essayé les approches suivantes:

  1. Utilisation de Jsch, établissement de la confiance entre deux machines (Linux local - distant, Linux distant - Linux distant) et écriture de fichiers à l’aide de sftp. (Terminé)
  2. Exécution de sockets sur les deux machines - un émetteur, un destinataire (les deux en Java) (terminé)
  3. Tentative d’obtenir des E/S similaires à l’extrait de code pour les machines Windows (LAN) (non réalisé)

En faisant tout cela, j’ai eu beaucoup de questions, lu beaucoup de messages, etc. et j’ai senti que quelque chose me manquait sur les fondamentaux:

  • Une sorte d'utilitaire de renforcement de la confiance (entre deux machines) sera nécessaire pour atteindre les entrées/sorties. Mais enfin, je veux écrire un code comme l'extrait de code donné, quels que soient les ordinateurs, le réseau, etc.
  • La solution Jsch et les autres solutions suggérées (utilisation de http, ftp, etc. sur URL) utilisent enfin certains services exécutés sur la machine distante. En d'autres termes, Java IO n'est PAS utilisé pour accéder au système de fichiers distant. Cela ne m'intéresse pas, car je compte sur des services plutôt que sur de bonnes anciennes entrées/sorties.
  • Samba, SSHFS sont aussi apparus sur la scène, pour ajouter à ma confusion. Mais je ne les vois pas comme les solutions à mon objectif!

Pour réitérer, je veux écrire un code en utilisant Java I/O (que ce soit simple ou normal, les deux sont acceptables) qui peuvent simplement lire, écrire des fichiers distants sans utiliser de services via des protocoles tels que ftp, http, etc. modèle . Est-ce que mes attentes sont valables?

  • Sinon, pourquoi et que puis-je faire de mieux pour lire/écrire des fichiers distants Avec Java?
  • Si oui, comment atteindre le même objectif!

P.S: Veuillez commenter au cas où je devrais élaborer pour poser ma question avec précision!

8
Kaliyug Antagonist

Si vous souhaitez accéder à un système de fichiers sur un ordinateur distant, cet ordinateur doit rendre son système de fichiers disponible avec un service. Un tel service est généralement un travail en arrière-plan, qui traite les demandes entrantes et renvoie une réponse, par exemple. pour l'authentification, l'autorisation, la lecture et l'écriture. La spécification du modèle demande/réponse s'appelle un protocole. Les protocoles bien connus sont SMB (ou SAMBA) sous Windows ou NFS sous UNIX/LINUX. Pour accéder à un tel service distant, montez le système de fichiers distant au niveau du système d'exploitation et rendez-le disponible localement en tant que lecteur sous Windows ou en tant que point de montage sous UNIX.

Vous pouvez ensuite accéder au système de fichiers distant à partir de votre programme Java, comme n'importe quel système de fichiers local.

Bien sûr, il est également possible d'écrire votre propre fournisseur de service de fichiers (avec votre propre couche de protocole) et de l'exécuter sur la machine distante. Comme couche de transport pour un tel effort, des sockets (TCP/IP) peuvent être utilisés. Une autre bonne couche de transport serait le protocole http, par exemple. avec un service reposant ou quelque chose basé sur WebDav.

5
mmehl

Pour répondre à votre question - Non , vos attentes ne sont pas valides. 

La récupération de fichiers d'un serveur distant dépend de manière inhérente des services exécutés sur ce serveur. Pour récupérer un fichier depuis un serveur distant, celui-ci doit attendre votre demande de fichier.

Les cas que vous avez énumérés dans votre question (en utilisant jsch et sftp, en utilisant des sockets Java émetteur et récepteur) que vous avez déjà obtenus, sont essentiellement les mêmes que ceux-ci:

File inputFile = new File(
            "\\172.17.89.76\EBook PDF");

La seule différence est que Java utilise le support intégré du système d'exploitation natif pour la lecture à partir d'un partage de style Windows. Un service de partage s'exécute sur la machine Windows distante (tout comme Samba sous Linux ou un programme de socket Java) en attente de votre demande.

À partir des documents de l'API Java sur File (http://docs.Oracle.com/javase/6/docs/api/Java/io/File.html)

Le chemin canonique d'un fichier qui réside sur une autre machine et auquel on accède via un protocole de système de fichiers distant tel que SMB ou NFS ...

Donc, essentiellement, "Bon vieux Java I/O" est plus ou moins juste une enveloppe sur des protocoles courants.

Pour répondre à la deuxième partie de votre question (qu'est-ce que je peux faire de mieux pour lire/écrire des fichiers distants avec Java?), Cela dépend du système distant auquel vous accédez et, plus important encore, des services are courir sur elle.

Dans le cas où votre machine distante cible est une machine Ubuntu, je dirais que la meilleure alternative serait d'utiliser Jsch. Si votre machine cible peut être une machine Windows ou une machine Linux, je préférerais probablement exécuter des sockets Java sur les deux machines (évidemment si vous avez ou non le droit d'installer votre application sur la machine distante).

De manière générale, choisissez le plus petit dénominateur commun entre vos systèmes cibles (en termes de protocoles de partage de fichiers).

12
Lawrence

Nous avons utilisé sshfs . Vous pouvez ajouter à/etc/fstab la ligne:

sshfs#user@remoteAddress:remoteDir /mnt/ssh Fuse defaults 0 0

et ensuite mount /mnt/ssh

2
Andrzej Jozwik

Je pense que RMI pourrait être la solution, vous pouvez configurer un serveur RMI sur la machine à laquelle vous souhaitez vous connecter et utiliser votre machine en tant que client.

Je voudrais donner au client un chemin d'accès au fichier qui sera envoyé au serveur, le serveur pourrait alors lire le fichier sous forme d'octets et le renvoyer au client.

0
Paul