【问题标题】:Basics - reading/writing remote files using Java基础 - 使用 Java 读/写远程文件
【发布时间】:2012-09-18 21:22:10
【问题描述】:

我首先需要在远程 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) 机器的代码 sn-p 的 I/O(未实现)

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

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

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

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

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

【问题讨论】:

  • 我不确定这会有所帮助,但你可以看看Apache VFS
  • Java 在某种程度上依赖于操作系统来执行 IO——即使是好的旧 IO 也使用这些——所以有点不清楚你的问题强调了什么。
  • @MadProgrammer 我检查了它,但我认为我的要求与文件“类型”无关;此外,它还支持通过我不想使用的 FTP、SFTP、HTTPS 等方式读取文件。谢谢和问候!
  • @Bhaskar 我想在 Machine1 上运行 Java 代码,它会创建一个指向 Machine2 上文件的 java.io.File 对象。一些可能性: 1. Machine1 和 Machine2 可以是 Windows-Linux、Windows-Windows、Linux-Linux 2. 可以在不同的网络上(不一定在 LAN 上)
  • 我认为你最好的、开箱即用的解决方案,如果你不想在本地下载文件是某种网络共享,比如 smb

标签: java file-io java-io


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    然后mount /mnt/ssh

    【讨论】:

    • 如果您有文件/home/user/remoteDir/dir/file.txtremote 机器,您可以将其挂载到您的机器上。您将通过以下方式访问它:/mnt/ssh/dir/file.txt 从您的本地计算机(远程安装点是 /home/user/remoteDir/)。对于测试安装sshfs 并致电sshfs user@hostname:remoteDir /mnt/ssh。从java代码运行简单new File("/home/user/remoteDir/dir/file.txt")
    • 哦!所以它大致类似于访问已安装的网络驱动器和/或共享文件夹。我会试试这个 - 谢谢!
    【解决方案3】:

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

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

    【讨论】:

    • 你是在暗示 Socket 的使用——两个程序正在运行,一个发送者,一个接收者?如果是,我之前已经尝试过,我不打算使用它。
    • 我不确定sockets,RMI(远程方法调用)是我认为的corba的java版本。
    • @Paul 它不是 Corba 的 Java 版本,而是可以在底层使用 Corba。
    【解决方案4】:

    要回答您的问题 - ,您的期望不成立。

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

    您在问题中列出的已经实现的案例(使用 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 套接字(显然取决于您是否有权在远程机器上安装应用程序)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多