Основи - четене/запис на отдалечени файлове с помощта на Java

Започнах с изискване за четене и писане на файлове в от/в директория на отдалечена Ubuntu машина.

Първо, написах Java програма, която може да чете, записва файлове от споделена папка на отдалечена Windows машина, т.е. в LAN. Тук нещо подобно работи на моята (локална) машина с Windows:

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

Сега, когато обмислям отдалечена Ubuntu машина, очевидно не мога да направя нещо подобно, тъй като машината не е в LAN (Не съм сигурен дали това може да се направи, дори ако е в LAN! ). Затова опитах следните подходи:

  1. Използване на Jsch, установяване на доверие между две машини (локален - отдалечен Linux, отдалечен Linux - отдалечен Linux) и писане на файл с помощта на sftp. (готово)
  2. Изпълнение на сокети на двете машини - един изпращач, един получател (и двете Java) (готово)
  3. Опит за постигане на I/O, подобен на кодовия фрагмент за Windows (LAN) машини (не е постигнат)

Докато правех всичко това, имах много запитвания, прочетох много публикации и т.н. и почувствах, че пропускам нещо в основите:

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

За да повторя, искам да напиша код, използвайки Java I/O (обикновен или nio, и двете са добре), който просто може да чете, пише отдалечени файлове, без да използва услуги през протоколи като ftp, http и т.н. или socket sender- модел приемника. Моето очакване валидно ли е?

  • Ако не, защо и какво е най-доброто, което мога да направя, за да чета/записвам отдалечени файлове с помощта на Java?
  • Ако да, как да постигнете същото!

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


person Kaliyug Antagonist    schedule 27.09.2012    source източник
comment
Не съм сигурен, че това ще помогне, но бихте могли да погледнете Apache VFS   -  person MadProgrammer    schedule 27.09.2012
comment
Java зависи на някакво ниво от операционната система, за да направи IO - дори добрият стар IO ги използва - така че малко неясно какво набляга на вашия въпрос.   -  person Bhaskar    schedule 27.09.2012
comment
@MadProgrammer Проверих го, но не мисля, че моето изискване трябва да прави нещо с файла „type“; също така поддържа четене на файлове през FTP, SFTP, HTTPS и т.н., които не желая да използвам. Благодаря и поздрави !   -  person Kaliyug Antagonist    schedule 27.09.2012
comment
@Bhaskar Искам да стартирам Java код на Machine1, който създава обект java.io.File, сочещ към файл на Machine2. Някои възможности: 1. Machine1 и Machine2 могат да бъдат Windows-Linux, Windows-Windows, Linux-Linux 2. Могат да бъдат в различни мрежи (не непременно в LAN)   -  person Kaliyug Antagonist    schedule 27.09.2012
comment
Мисля, че най-доброто ви готово решение, ако не искате да изтеглите файла локално, е някакъв вид мрежово споделяне, нещо като smb   -  person MadProgrammer    schedule 27.09.2012
comment
Преди известно време използвах RMI, за да внедря класове за отдалечен поток, позволяващи редовен тръбопровод на поток, след като целевата машина е създала манипулатор/пънче за отдалечения поток. Това, разбира се, изисква някакъв вид услуга, която да се изпълнява на целевата машина. Използвах това за поточно предаване на GB данни от клиенти на WebStart към централен файлов сървър.   -  person Stefan    schedule 11.10.2012


Отговори (4)


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

След това можете да получите достъп до отдалечената файлова система от вашата Java програма като всяка локална файлова система.

Разбира се, също така е възможно да напишете свой собствен доставчик на файлови услуги (с ваш собствен протоколен слой) и да го стартирате на отдалечената машина. Като транспортен слой за такова начинание могат да се използват сокети (TCP/IP). Друг добър транспортен слой би бил http протоколът, напр. със спокойна услуга или нещо, базирано на WebDav.

person mmehl    schedule 05.10.2012

За да отговоря на въпроса ви - Не, очакванията ви не са валидни.

Извличането на файлове от отдалечен сървър по своята същност зависи от услугите, работещи на този сървър. За да извлечете файл от отдалечен сървър, отдалеченият сървър трябва да очаква вашата заявка за файл.

Случаите, които изброихте във вашия въпрос (използване на jsch и sftp, използване на изпращащ и получател на Java сокети), които вече сте постигнали, са по същество същите като този:

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

Единствената разлика е, че Java използва вградената поддръжка на родната операционна система за четене от споделяне на стил на Windows. Отдалечената Windows машина има услуга за споделяне, работеща на нея (точно като Samba на linux или програма за java socket), чакаща вашата заявка.

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

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

Така че по същество "Добрият стар Java I/O" е повече или по-малко просто обвивка на някои общи протоколи.

За да отговоря на втората част от въпроса ви (какво е най-доброто, което мога да направя, за да чета/записвам отдалечени файлове с помощта на Java?), това зависи от това до каква отдалечена система имате достъп и, което е по-важно, какви услуги работят по него.

В случай, че вашата целева отдалечена машина е Ubuntu машина, бих казал, че най-добрата алтернатива би била да използвате Jsch. Ако вашата целева машина може да бъде или машина с Windows, или машина с Linux, вероятно бих избрал да стартирам Java сокети на двете машини (очевидно зависи от това дали имате достъп до инсталиране на вашето приложение на отдалечената машина).

Най-общо казано, отидете с общия най-малък знаменател между вашите целеви системи (по отношение на протоколите за споделяне на файлове).

person Lawrence    schedule 10.10.2012

Използвахме sshfs. Можете да добавите към /etc/fstab реда:

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

и след това mount /mnt/ssh

person Andrzej Jozwik    schedule 05.10.2012
comment
Ако имате файл /home/user/remoteDir/dir/file.txt или remote машина, можете да го монтирате към вашата машина. Ще получите достъп до него чрез: /mnt/ssh/dir/file.txt от вашата локална машина (отдалечената точка на монтиране е /home/user/remoteDir/). За тест инсталирайте sshfs и се обадете на sshfs user@hostname:remoteDir /mnt/ssh. От java код стартирайте просто new File("/home/user/remoteDir/dir/file.txt") - person Andrzej Jozwik; 09.10.2012
comment
О! Така че е приблизително подобно на достъп до монтирано мрежово устройство и/или споделена папка. Ще пробвам този - благодаря! - person Kaliyug Antagonist; 11.10.2012

Мисля, че RMI може да е решението, можете да настроите сървър RMI сървър на машината, към която искате да се свържете, и да използвате вашата машина като клиент.

Бих дал на клиента път до файла, който ще бъде изпратен на сървъра, след което сървърът може да прочете файла като байтове и да изпрати файла обратно на клиента.

person Paul    schedule 05.10.2012
comment
Намеквате ли за използването на Socket - две работещи програми, един подател, един получател? Ако да, пробвал съм го по-рано и нямам намерение да го използвам. - person Kaliyug Antagonist; 09.10.2012
comment
Не съм сигурен за сокети, RMI (отдалечено извикване на метод) е java версията на corba според мен. - person Paul; 10.10.2012
comment
@Paul не е толкова Java версията на Corba, но може да използва Corba под капака. - person Stefan; 11.10.2012