Основы чтения/записи удаленных файлов с помощью 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!). Поэтому я попробовал следующие подходы:
- использование Jsch, установление доверия между двумя машинами (локально - удаленный Linux , удаленный Linux - удаленный Linux) и запись файлов с помощью sftp.(готово)
- запуск сокетов на двух машинах - один отправитель, один приемник(оба Java)(готово)
- попытка достичь ввода-вывода, Как фрагмент кода для 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-адрес вашей системы и удаленной системы. потом просто пытался написать код для чтения или записи файлов, как в самой системе.