9

我首先要求在远程 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. 尝试实现类似于 Windows (LAN) 机器的代码片段的 I/O(未实现)

在做所有这些的时候,我有很多疑问,阅读了很多帖子等,我觉得我在基础上遗漏了一些东西:

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

重申一下,我想使用 Java I/O(plain 或 nio,两者都很好)编写代码,它可以简单地读取、写入远程文件,而无需使用 ftp、http 等协议或套接字发送方-接收方模型上的服务。我的期望有效吗?

  • 如果不是,为什么以及我能做的最好的事情是使用 Java 读/写远程文件?
  • 如果是,如何达到同样的效果!

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

4

4 回答 4

12

回答您的问题 -,您的期望无效。

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

您在问题中列出的已经实现的案例(使用 jsch 和 sftp,使用发送方和接收方 Java 套接字)基本上与此相同:

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

唯一的区别是 Java 使用本机操作系统内置的支持从 Windows 样式共享中读取。远程 Windows 机器上有一个正在运行的共享服务(就像 linux 上的 Samba 或 java 套接字程序)等待您的请求。

File来自(http://docs.oracle.com/javase/6/docs/api/java/io/File.html)上的 Java API 文档

位于其他机器上的文件的规范路径名,可通过远程文件系统协议(如 SMB 或 NFS ...

所以本质上,“Good old Java I/O”或多或少只是一些常见协议的包装。

要回答您问题的第二部分(使用 Java 读取/写入远程文件,我能做的最好的事情是什么?),这取决于您正在访问的远程系统,更重要的是,它上面运行了哪些服务。

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

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

于 2012-10-10T12:25:33.857 回答
6

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

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

当然也可以编写自己的文件服务提供者(使用自己的协议层)并在远程机器上运行它。作为此类尝试的传输层,可以使用套接字 (TCP/IP)。另一个好的传输层是 http 协议,例如带有一个 restful 服务或基于 WebDav 的东西。

于 2012-10-05T21:06:17.847 回答
3

我们使用了 sshfs。您可以在 /etc/fstab 中添加以下行:

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

接着mount /mnt/ssh

于 2012-10-05T21:32:11.457 回答
0

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

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

于 2012-10-05T23:27:57.660 回答