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

Kal*_*ist 8 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*/
Run Code Online (Sandbox Code Playgroud)

现在,当我考虑一台远程Ubuntu机器时,显然我不能做这样的事情,因为机器不在局域网上(我不确定即使它在LAN上也能做到!).因此,我尝试了以下方法:

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

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

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

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

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

PS:如果我需要精心准确地提出我的问题,请发表评论!

Law*_*nce 12

回答你的问题 - ,你的期望是无效的.

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

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

File inputFile = new File(
            "\\172.17.89.76\EBook PDF");
Run Code Online (Sandbox Code Playgroud)

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

来自Java API文档File(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套接字(显然取决于您是否有权在远程机器上安装您的应用程序).

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


mme*_*ehl 5

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

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

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