我开始要求在远程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机器时,显然我不能做这样的事情,因为机器不在局域网上(我不确定即使它在局域网上也可以完成!)。因此,我尝试了以下方法:
在完成所有这些工作的同时,我有很多疑问,阅读过很多帖子等等。我觉得我在基础知识上缺少一些东西:
重申一下,我想用Java I / O编写代码(普通的或者nio,两者都很好),只需要读取,编写远程文件而不使用ftp,http等协议的服务。套接字发送方 - 接收方模型。我的期望是否有效?
P.S:如果我需要详细说明我的问题,请发表评论!
答案 0 :(得分:12)
要回答您的问题 - 否,您的期望无效。
从远程服务器检索文件本质上依赖于该服务器上运行的服务。要从远程服务器检索文件,远程服务器需要期待您对文件的请求。
您在问题中列出的案例(使用jsch和sftp,使用发件人和接收者Java套接字)已经实现了,基本上与此相同:
File inputFile = new File(
"\\172.17.89.76\EBook PDF");
唯一的区别是Java使用本机操作系统内置支持从Windows样式共享中读取。远程Windows机器上运行的共享服务(就像Linux上的Samba或java套接字程序)等待您的请求。
来自File
上的Java API文档(http://docs.oracle.com/javase/6/docs/api/java/io/File.html)
驻留在其他计算机上的文件的规范路径名,可通过远程文件系统协议(如SMB或NFS)进行访问...
所以基本上“Good old Java I / O”或多或少只是一些常见协议的包装。
回答问题的第二部分(使用Java读取/写入远程文件可以做什么最好?),这取决于您访问的远程系统,更重要的是,服务< / strong>正在运行。
如果您的目标远程计算机是Ubuntu计算机,我会说最好的选择是使用Jsch。如果您的目标计算机可以是Windows计算机或Linux计算机,我可能会在两台计算机上运行Java套接字(显然取决于您是否有权在远程计算机上安装您的应用程序)。
一般来说,请使用目标系统之间的共同最小分母(就文件共享协议而言)。
答案 1 :(得分:5)
如果要访问远程计算机上的文件系统,则此计算机必须使用服务使其文件系统可用。这种服务通常是后台作业,它处理传入的请求并返回响应,例如,用于认证,授权,阅读和写作。请求/响应模式的规范称为协议。众所周知的协议是Windows上的SMB(或SAMBA)或UNIX / LINUX上的NFS。要访问此类远程服务,您需要在操作系统级别上安装远程文件系统,并使其在本地作为Windows上的驱动器或UNIX上的挂载点使用。
然后,您可以像任何本地文件系统一样从Java程序访问远程文件系统。
当然,也可以编写自己的文件服务提供程序(使用自己的协议层)并在远程计算机上运行它。可以使用用于这种努力套接字(TCP / IP)的传输层。另一个好的传输层是http协议,例如提供宁静的服务或基于WebDav的东西。
答案 2 :(得分:2)
我们使用sshfs。您可以在/ etc / fstab中添加以下行:
sshfs#user@remoteAddress:remoteDir /mnt/ssh fuse defaults 0 0
然后mount /mnt/ssh
答案 3 :(得分:0)
我认为RMI可能是解决方案,您可以在要连接的计算机上设置服务器RMI服务器,并将您的计算机用作客户端。
我会给客户端一个文件的路径,这个文件将发送到服务器,然后服务器可以将文件作为字节读入并将文件发送回客户端。
答案 4 :(得分:-2)
首先,你必须ping你的系统和远程系统的IP地址。 然后只是尝试在系统本身中编写读取或写入文件的编码。