9
votes

Principes de base - Lecture / écriture de fichiers distants à l'aide de Java

J'ai commencé avec l'exigence de lecture et d'écriture de fichiers dans / dans un répertoire sur une machine Ubuntu distante.

Premier, j'ai écrit un programme Java qui pourrait lire, écrire des fichiers d'un dossier partagé sur une machine Windows distante, c'est-à-dire. sur un réseau local. Ici, quelque chose comme ça fonctionne sur ma machine à Windows (locale): xxx

Maintenant, lorsque je considère une machine ubuntu distante, je ne peux évidemment pas faire quelque chose comme ceci car la machine n'est pas Sur le réseau local ( Je ne suis pas sûr que cela puisse être fait même s'il est sur le réseau local !). Par conséquent, j'ai essayé de suivre les approches:

  1. Utilisation de JSCH, établissant la fiducie entre deux machines (local - Remote Linux, distante Linux à distance) et la rédaction de fichiers à l'aide de SFTP. (DONE)
  2. Prises d'exécution sur les deux machines - un expéditeur, un récepteur (Java) (Done)
  3. Tentative d'Attribution d'E / S. L'extrait de code des machines pour Windows (LAN) (non atteint)

    Tout en faisant tout cela, j'ai eu de nombreuses questions, lisez de nombreux postes, etc. Et je me sentais que je manque quelque chose sur les fondamentaux:

    • Une sorte de construction de confiance (entre deux machines) utilitaire sera nécessaire pour atteindre IO. Mais enfin, je veux écrire un code comme l'extrait donné, quelles que soient les machines, le réseau, etc.
    • La solution JSCH et les autres suggéraient (utilisation de HTTP, FTP, etc. Sur l'URL) utilisent enfin des services qui fonctionnent sur la machine distante. En d'autres termes, ce n'est pas que Java Io est utilisé pour accéder au système de fichiers distant - cela ne me plaise pas car je compose des services plutôt que d'utiliser des I / O de bon vieux.
    • Samba, SSHFS a également évoqué sur la scène, seulement pour ajouter à ma confusion. Mais je ne les vois pas comme les solutions à mon objectif!

      Pour réitérer, Je souhaite écrire un code à l'aide de Java E / S (SIML ou Nio, les deux sont corrects) qui peuvent simplement lire, écrire des fichiers distants sans utiliser de services sur des protocoles tels que FTP, HTTP, etc. Modèle de récepteur d'expéditeur de socket . Mon attente est valable?

      • sinon, pourquoi et quel est le meilleur que je puisse faire pour lire / écrire des fichiers distants Utilisation de Java?
      • Si oui, comment atteindre le même!

        P.s: Veuillez commenter au cas où je devrais élaborer une question de pose avec précision!


6 commentaires

Je ne suis pas sûr que cela aidera, mais vous pourriez jeter un coup d'œil à Apache VFS


Java dépend d'un certain niveau sur le système d'exploitation pour faire l'IO - même la bonne vieille vie utilisée - donc un peu pas clair ce que votre question souligne.


@MadProgrammateur Je l'ai vérifié mais je ne pense pas que mes besoins doivent faire quoi que ce soit avec le fichier "type"; En outre, il prend en charge la lecture de fichiers sur FTP, SFTP, HTTPS, etc. que je ne souhaite pas utiliser. Merci et salutations !


@Bhaskar je veux exécuter le code Java sur la machine1 qui crée un objet java.io.file pointant vers un fichier sur la machine2. Certaines possibilités: 1. Machine1 et Machine2 peuvent être Windows-Linux, Windows-Windows, Linux-Linux 2. Peut être sur différents réseaux (pas nécessairement sur LAN).


Je pense que votre meilleure solution de boîte, si vous ne voulez pas télécharger le fichier localement, c'est une sorte de part de réseau, quelque chose comme SMB


Il y a un bon moment, j'ai utilisé RMI pour implémenter des classes de flux à distance permettant une tuyauterie de flux régulière une fois que la machine cible avait créé une poignée / un talon pour le flux distant. Cela nécessite un type de service sur la machine cible. J'ai utilisé cela pour diffuser GB de données de clients WebStart sur un serveur de fichiers central.


4 Réponses :


6
votes

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 typiquement un travail d'arrière-plan, qui gère les demandes entrantes et renvoie une réponse, par ex. Pour l'authentification, l'autorisation, la lecture et l'écriture. La spécification du modèle de demande / réponse est appelée protocole. Les protocoles bien connus sont SMB (ou Samba) sur Windows ou NFS sur UNIX / Linux. Pour accéder à un tel service à distance, vous montez le système de fichiers distant sur le niveau du système d'exploitation et la rendre disponible localement en tant que lecteur sous Windows ou comme point de montage sur UNIX.

Ensuite, vous pouvez 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 services de fichiers (avec votre propre couche de protocole) et de l'exécuter sur la machine distante. Comme une couche de transport pour des prises de telle Endeavour (TCP / IP) peut être utilisée. Une autre bonne couche de transport serait le protocole HTTP, par ex. avec un service reposant ou quelque chose basé sur webdav.


0 commentaires

3
votes

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

sshfs # User @ Remoteaddress: RemoteDir / MNT / SSH Fuse Fuse par défaut 0 0

puis montage / mnt / ssh


2 commentaires

Si vous avez fichier /home/user/remotedir/dir/file.txt ou distant machine que vous pouvez monter sur votre machine. Vous y trouverez: /mnt/ssh/dir/file.txh/dir/file.txt à partir de votre machine locale (point de montage à distance est / Accueil / utilisateur / RemoteDir / ). Pour tester l'installation SSHFS et appelez SSHFS User @ HostName: RemoteDir / MNT / SSH < / code>. De Java Code Run Simple Nouveau fichier ("/ home / utilisateur / remotedir / dir / fichier.txt")


Oh ! Il est donc à peu près similaire à l'accès d'un lecteur réseau monté et / ou d'un dossier partagé. Je vais essayer celui-ci - merci!



0
votes

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

Je donnerais au client un chemin d'accès au fichier Ceci sera envoyé au serveur, le serveur pourrait ensuite lire dans le fichier sous forme d'octets et envoyer le fichier au client.


3 commentaires

Aspectez-vous à l'usage de Socket - Deux programmes en cours d'exécution, un expéditeur, un récepteur? Si oui, je l'ai essayé plus tôt et je n'ai pas l'intention de l'utiliser.


Je ne suis pas sûr des sockets, RMI (Invocation de la méthode à distance) est la version Java de Corba, je pense.


@Paul, ce n'est pas tant la version Java de Corba mais peut utiliser Corba sous le capot.



12
votes

Pour répondre à votre question - non fort>, votre attente n'est pas valide.

récupérer des fichiers à partir d'un serveur distant dépend de manière intrinsèquement dépendant des services exécutés sur ce serveur. Pour récupérer un fichier à partir d'un serveur distant, le serveur distant doit s'attendre à votre demande de fichier. P>

Les cas que vous avez énuméré dans votre question (à l'aide de JSCH et SFTP, à l'aide d'un expéditeur et d'un récepteur Java Sockets) que vous avez déjà atteint, sont essentiellement les mêmes que ceci: P>

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


0 commentaires