基础知识 - 使用Java读/写远程文件

时间:2012-09-27 06:36:33

标签: java file-io java-io

我开始要求在远程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机器时,显然我不能做这样的事情,因为机器不在局域网上(我不确定即使它在局域网上也可以完成!)。因此,我尝试了以下方法:

  1. 使用Jsch,在两台机器之间建立信任(本地 - 远程Linux,远程Linux - 远程Linux)和使用sftp写入文件。(完成)
  2. 在两台机器上运行套接字 - 一个发送方,一个接收方(两个Java)(已完成)
  3. 尝试实现I / O相似的Windows(LAN)计算机代码片段(未实现)
  4. 在完成所有这些工作的同时,我有很多疑问,阅读过很多帖子等等。我觉得我在基础知识上缺少一些东西:

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

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

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

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

5 个答案:

答案 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地址。 然后只是尝试在系统本身中编写读取或写入文件的编码。