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

基础知识-使用Java读取/写入远程文件,java,file-io,java-io,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机器的目录中读写文件

首先,我编写了一个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上也能做到这一点)。因此,我尝试了以下方法:

  • 使用Jsch,在两台机器(本地-远程Linux、远程Linux-远程Linux)之间建立信任,并使用sftp编写文件。(完成)
  • 在两台机器上运行套接字-一个发送方,一个接收方(都是Java)(完成)
  • 试图实现类似于Windows(LAN)计算机的代码段的I/O(未实现)
  • 在做所有这些的时候,我有很多疑问,读了很多帖子,我觉得我缺少一些基本的东西:

    • 实现IO需要某种信任建立(两台机器之间)实用程序。但最后,我想写一段代码,就像给定的代码片段一样,不考虑机器、网络等
    • Jsch解决方案和其他建议(通过URL使用http、ftp等)最终使用的是在远程机器上运行的一些服务。换句话说,并不是Java IO被用来访问远程文件系统——这对我没有吸引力,因为我依赖于服务,而不是使用好的旧I/O
    • Samba、SSHFS也出现在现场,只会让我更加困惑。但我不认为它们是我目标的解决方案
    重申一下,我想使用Java I/O(普通或nio都可以)编写一个代码,它可以简单地读取、写入远程文件,而无需使用ftp、http等协议或套接字发送方-接收方模型上的服务。我的期望有效吗

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

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

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

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

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

    我们使用的。您可以将以下内容添加到/etc/fstab行:

    sshfs#user@remoteAddress:remoteDir/mnt/ssh保险丝默认值为0


    然后
    mount/mnt/ssh

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


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

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

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

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

    File inputFile = new File(
                "\\172.17.89.76\EBook PDF");
    
    唯一的区别是Java使用本机操作系统的内置支持来读取windows风格的共享。远程windows计算机上有一个正在运行的共享服务(就像linux上的Samba或java套接字程序)正在等待您的请求

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

    驻留在其他计算机上并通过远程文件系统协议(如SMB或NFS)访问的文件的规范路径名

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

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

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


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

    我不确定这是否有帮助,但是你可以看一看Java在某种程度上依赖操作系统来完成IO——即使是好的旧IO也使用了这些——所以有点不清楚你的问题强调了什么。@我检查了它,但我认为我的要求与文件“类型”没有任何关系;此外,它还支持通过FTP、SFTP、HTTPS等方式读取文件,我不希望这样做