Основы чтения/записи удаленных файлов с помощью Java

Я начал с требования чтения и записи файлов из / в каталог на удаленной машине Ubuntu.

во-первых, я написал программу Java,которая могла читать, писать файлы из общей папки на удаленной машине Windows i.e в локальной сети. Здесь что-то вроде этого работает на моей(локальной) машине Windows :

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

теперь, когда я рассматриваю удаленную машину Ubuntu, очевидно, я не могу сделать что-то подобное, поскольку машина не находится в локальной сети(Я не уверен, что это можно сделать, даже если он находится на LAN!). Поэтому я попробовал следующие подходы:

  1. использование Jsch, установление доверия между двумя машинами (локально - удаленный Linux , удаленный Linux - удаленный Linux) и запись файлов с помощью sftp.(готово)
  2. запуск сокетов на двух машинах - один отправитель, один приемник(оба Java)(готово)
  3. попытка достичь ввода-вывода, Как фрагмент кода для Windows (LAN) машин (не достигнуто)

пока делая все это, у меня было много запросов, прочитал много сообщений и т. д. и я почувствовал, что мне чего-то не хватает по основам :

  • для достижения ввода-вывода потребуется какая-то утилита укрепления доверия(между двумя машинами). Но, наконец, я хочу написать код, подобный приведенному фрагменту, независимо от машин, сети и т. д.
  • решение Jsch и другие предложенные(использование http, ftp и т. д. по URL), наконец, используют некоторые службы, которые работают на удаленном машина. Другими словами, это не то, что Java IO используется для доступа к удаленной файловой системе - это не привлекает меня, поскольку я полагаюсь на службы, а не использую старый добрый I/O.
  • Самба, SSHFS тоже выскочил на сцену, только чтобы добавить к моему замешательству. Но я не вижу в них решения моей задачи !

, чтобы повторить, я хочу написать код, используя Java I / O(либо обычный, либо nio, оба в порядке), который просто может читать, писать удаленные файлы без использование служб по протоколам, таким как ftp, http и т. д. или модель Socket sender-receiver. Оправдано ли мое ожидание?

  • если нет, то почему и что лучше всего я могу сделать для чтения / записи удаленных файлов используя Java?
  • если да, то как добиться того же !

P. S: пожалуйста, прокомментируйте, если мне нужно уточнить, чтобы точно задать свой вопрос !

5 ответов


Если вы хотите получить доступ к файловой системе на удаленном компьютере, то этот компьютер должен сделать его файловую систему доступной с помощью службы. Такая служба обычно является фоновым заданием, которое обрабатывает входящие запросы и возвращает ответ, например, для аутентификации, авторизации, чтения и записи. Спецификация шаблона запроса / ответа называется протоколом. Хорошо известны протоколы SMB (или SAMBA) в Windows или NFS в UNIX/LINUX. Для доступа к такой удаленной службе вы монтируете удаленная файловая система на уровне операционной системы и сделать его доступным локально в качестве диска на Windows или в качестве точки монтирования на UNIX.

затем вы можете получить доступ к удаленной файловой системе из Java-программы, как и любой локальной файловой системы.

конечно, также можно написать свой собственный поставщик файловых услуг (с вашим собственным уровнем протокола) и запустить его на удаленном компьютере. В качестве транспортного уровня для такого усилия могут использоваться сокеты (TCP/IP). Еще один хороший транспортный слой будет протокол http, например, с сервисом restful или что-то на основе WebDav.


чтобы ответить на ваш вопрос -нет, ваше ожидание недействительно.

извлечение файлов с удаленного сервера по своей сути зависит от служб, запущенных на этом сервере. Чтобы получить файл с удаленного сервера, удаленный сервер должен ожидать вашего запроса на файл.

случаи, которые вы перечислили в своем вопросе (используя jsch и sftp, используя Java-сокеты отправителя и получателя), которые вы уже достигли, по существу такие же, как это:

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

единственная разница в том, что Java использует встроенную поддержку родной ОС для чтения из общего ресурса стиля windows. На удаленной машине windows работает служба общего доступа (как Samba в linux или программа Java socket), ожидающая вашего запроса.

из документов API Java на File (http://docs.oracle.com/javase/6/docs/api/java/io/File.html)

канонический путь к файлу, который находится на другом машина и доступна через протокол удаленной файловой системы, такой как SMB или NFS ...

таким образом, по существу, "старый добрый Java I / O" - это более или менее просто оболочка над некоторыми общими протоколами.

чтобы ответить на вторую часть вашего вопроса (что я могу сделать для чтения/записи удаленных файлов с помощью Java?), это зависит от того, к какой удаленной системе вы обращаетесь и, что более важно, что услуги работает на нем.

в случае вашей цели удаленная машина, являющаяся машиной Ubuntu, я бы сказал, что лучшей альтернативой было бы использовать Jsch. Если ваша целевая машина может быть либо машиной windows, либо машиной linux, я бы, вероятно, пошел на запуск Java-сокетов на двух машинах (очевидно, в зависимости от того, есть ли у вас доступ к установке приложения на удаленной машине).

вообще говоря, идите с общим наименьшим знаменателем между вашими целевыми системами (С точки зрения протоколов обмена файлами).


мы sshfs. Вы можете добавить в /etc/fstab добавить строку:

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

а то mount /mnt/ssh


Я думаю, что RMI может быть решением, вы можете настроить сервер на сервере RMI на машине, к которой хотите подключиться, и использовать свою машину клиентом.

Я бы дал клиенту путь к файлу, который будет отправлен на сервер, сервер мог бы затем прочитать файл в байтах и отправить файл обратно клиенту.


прежде всего, вы должны пинговать ip-адрес вашей системы и удаленной системы. потом просто пытался написать код для чтения или записи файлов, как в самой системе.