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:
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:
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?
P.S: Veuillez commenter au cas où je devrais élaborer pour poser ma question avec précision!
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.
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).
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
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.