Ich begann mit der Anforderung, Dateien in / aus einem Verzeichnis auf einem entfernten Ubuntu-Rechner zu lesen und zu schreiben.
Zuerst schrieb ich ein Java-Programm, das Dateien aus einem freigegebenen Ordner auf einer entfernten Windows-Maschine, d. h. in einem LAN, lesen und schreiben konnte. Hier funktioniert so etwas auf meinem (lokalen) Windows Rechner:
%Vor%Wenn ich jetzt einen entfernten Ubuntu-Rechner in Betracht ziehe, kann ich natürlich nicht so etwas tun, da der Rechner nicht im LAN ist ( Ich bin mir nicht sicher, ob das auch im LAN möglich ist !). Daher habe ich folgende Ansätze versucht:
Während ich all dies machte, hatte ich viele Fragen, las viele Beiträge usw. und ich fühlte, dass mir etwas an den Grundlagen fehlte:
Ich wiederhole: Ich möchte einen Code mit Java I / O schreiben (entweder plain oder nio, beide sind in Ordnung), die einfach entfernte Dateien lesen können, ohne Dienste über Protokolle wie ftp, http usw. zu benutzen Socket-Sender-Empfänger-Modell . Ist meine Erwartung gültig?
PS: Bitte kommentieren Sie, falls ich meine Frage genau formulieren muss!
Wenn Sie auf ein Dateisystem auf einem Remote-Computer zugreifen wollen, muss dieser Computer sein Dateisystem mit einem Dienst verfügbar machen. Ein solcher Dienst ist typischerweise ein Hintergrund-Job, der eingehende Anfragen behandelt und eine Antwort, z. zur Authentifizierung, Autorisierung, Lesen und Schreiben. Die Spezifikation des Anfrage- / Antwortmusters wird als Protokoll bezeichnet. Bekannte Protokolle sind SMB (oder SAMBA) unter Windows oder NFS unter UNIX / LINUX. Um auf einen solchen Remote-Service zuzugreifen, mounten Sie das Remote-Dateisystem auf der Ebene des Betriebssystems und stellen es lokal als Laufwerk unter Windows oder als Mount-Point unter UNIX zur Verfügung.
Dann können Sie wie jedes lokale Dateisystem von Ihrem Java-Programm auf das entfernte Dateisystem zugreifen.
Natürlich ist es auch möglich, einen eigenen Dateidienstanbieter (mit Ihrer eigenen Protokollschicht) zu schreiben und auf dem Remote-Rechner auszuführen. Als Transportschicht für ein solches Vorhaben können Sockets (TCP / IP) verwendet werden. Eine andere gute Transportschicht wäre das http-Protokoll, z. mit einem erholsamen Service oder etwas, das auf WebDav basiert.
Um Ihre Frage zu beantworten - Nein ist Ihre Erwartung nicht gültig.
Das Abrufen von Dateien von einem Remote-Server hängt von den auf diesem Server ausgeführten Diensten ab. Um eine Datei von einem Remote-Server abzurufen, muss der Remote-Server Ihre Anfrage für eine Datei erwarten.
Die Fälle, die Sie in Ihrer Frage (mit jsch und sftp, unter Verwendung von Java-Sockets von Sender und Empfänger) aufgelistet haben, die Sie bereits erreicht haben, sind im Wesentlichen dieselben:
%Vor%Der einzige Unterschied besteht darin, dass Java die integrierte Unterstützung für das Lesen einer Windows-Freigabe verwendet. Auf dem Remote-Windows-Rechner läuft ein Sharing-Service (genau wie Samba unter Linux oder ein Java-Socket-Programm), der auf Ihre Anfrage wartet.
Aus den Java-API-Dokumenten für File
(http://docs.oracle.com/javase/6/docs/api/java/io/File.html)
Der kanonische Pfadname einer Datei, die sich auf einer anderen Maschine befindet und auf die über ein Remote-Dateisystem-Protokoll wie SMB oder NFS zugegriffen wird ...
Also im Wesentlichen "Good old Java I / O" ist mehr oder weniger nur ein Wrapper über einige gebräuchliche Protokolle.
Um den zweiten Teil Ihrer Frage zu beantworten (Was kann ich am besten tun, um entfernte Dateien mit Java zu lesen / schreiben?), hängt davon ab, auf welches Remote-System Sie zugreifen und vor allem welche Dienste laufen darauf.
Wenn Ihre Ziel-Remote-Maschine eine Ubuntu-Maschine ist, würde ich sagen, die beste Alternative wäre die Verwendung von Jsch. Wenn Ihr Zielcomputer entweder ein Windows-Rechner oder ein Linux-Rechner sein kann, würde ich wahrscheinlich Java-Sockets auf den beiden Rechnern ausführen (natürlich abhängig davon, ob Sie Zugriff auf die Installation Ihrer App auf dem entfernten Rechner haben).
Gehen Sie im Allgemeinen mit dem gemeinsamen kleinsten Nenner zwischen Ihren Zielsystemen (in Bezug auf Dateifreigabe-Protokolle).
Wir haben sshfs verwendet. Sie können zu / etc / fstab die Zeile hinzufügen:
sshfs#user@remoteAddress:remoteDir /mnt/ssh fuse defaults 0 0
und dann mount /mnt/ssh
Ich denke, RMI könnte die Lösung sein, Sie könnten einen Server einen RMI-Server auf dem Rechner einrichten, mit dem Sie sich verbinden wollen, und Ihren Rechner als Client verwenden.
Ich würde dem Client einen Pfad zu der Datei geben, der an den Server gesendet wird, der Server könnte dann die Datei als Bytes einlesen und die Datei zurück an den Client senden.