基础知识 – 使用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上也能做到 !)。 因此,我尝试了以下方法:

  1. 使用Jsch,在两台机器之间建立信任(本地 – 远程Linux,远程Linux – 远程Linux)和使用sftp写入文件。(完成)
  2. 在两台机器上运行套接字 – 一个发送器,一个接收器(两个Java)(完成)
  3. 试图实现I / O相似的Windows(LAN)机器的代码片段(未实现)

在做所有这些的同时,我有很多疑问,阅读过很多post等等,我觉得我在基础知识上缺少一些东西:

  • 实现IO需要某种信任构建(在两台机器之间)实用程序。 但最后,我想编写一个类似于代码片段的代码,无论机器,网络等。
  • Jsch解决方案和其他建议(在URL上使用http,ftp等)最终使用在远程计算机上运行的一些服务。 换句话说,并不是Java IO被用于访问远程文件系统 – 这对我没有吸引力,因为我依赖于服务而不是使用旧的I / O.
  • Samba,SSHFS太突然出现在场景中,只会增加我的困惑。 但我不认为它们是我的目标的解决方案!

重申一下我想使用Java I / O(普通或nio,两者都很好)编写代码,它只能读取,编写远程文件而不使用ftp,http等协议或套接字发送器 – 接收器模型的服务 。 我的期望有效吗?

  • 如果没有,为什么以及使用Java读取/写入远程文件的最佳方法是什么?
  • 如果是的话,如何实现同样的目标!

PS:如果我需要详细说明我的问题,请发表评论!

如果要访问远程计算机上的文件系统,则此计算机必须使用服务使其文件系统可用。 这样的服务通常是后台作业,其处理传入的请求并返回响应,例如用于认证,授权,读取和写入。 请求/响应模式的规范称为协议。 众所周知的协议是Windows上的SMB(或SAMBA)或UNIX / LINUX上的NFS。 要访问此类远程服务,请将远程文件系统挂载到操作系统级别,并使其在本地作为Windows上的驱动器或UNIX上的挂载点使用。

然后,您可以像任何本地文件系统一样从Java程序访问远程文件系统。

当然,也可以编写自己的文件服务提供程序(使用自己的协议层)并在远程计算机上运行它。 可以使用用于这种努力套接字(TCP / IP)的传输层。 另一个好的传输层是http协议,例如使用restful服务或基于WebDav的东西。

回答你的问题 – ,你的期望是无效的。

从远程服务器检索文件本质上依赖于在该服务器上运行的服务。 要从远程服务器检索文件,远程服务器需要期待您对文件的请求。

您在问题中列出的案例(使用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读取/写入远程文件可以做什么最好?),这取决于您正在访问的远程系统,更重要的是,它依赖于正在运行的服务

如果您的目标远程计算机是Ubuntu计算机,我会说最好的选择是使用Jsch。 如果您的目标计算机可以是Windows计算机或Linux计算机,我可能会在两台计算机上运行Java套接字(显然取决于您是否有权在远程计算机上安装您的应用程序)。

一般来说,使用目标系统之间的共同最小分母(就文件共享协议而言)。

我们使用了sshfs 。 你可以添加到/ etc / fstab行:

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

然后mount /mnt/ssh

我认为RMI可能是解决方案,您可以在要连接的计算机上设置服务器RMI服务器,并将您的计算机用作客户端。

我会给客户端一个文件的路径,这将发送到服务器,服务器然后可以作为字节读入文件并将文件发送回客户端。

首先,你必须ping你的系统和远程系统的IP地址。 然后只是尝试在系统本身内编写读取或写入文件的编码。