如何从SFTP中保存文件对象作为本地文件



我想编写一个Java程序来测试界面,该界面通过SFTP通过XML-Files进行通信。接口的想法是,一侧上传XML文件,然后另一侧对其进行处理,将其删除并将另一个XML文件上传为确认。

我的程序应该做的是上传XML文件,等待它消失,等待响应,将其保存为本地文件,然后检查响应的正确性。我使用org.apache.commons.vfs2和fileObjects实现了此功能,并可以成功上传XML文件,等待它消失并检查确认文件的存在。但是,一旦我尝试使用代码将文件作为文档解析为文档

    FileObject ackFileObject = VFS.getManager().resolveFile("sftp://user@sftp.server.com/SFTPfolder/file.xml");
    File ackFile = new File(ackFileObject.getName().getPath());
    DocumentBuilderFactory documentBuilderFactory = 
    DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    Document document = documentBuilder.parse(ackFile);

我得到了一个filenotfoundexception,因为文档构建器试图从 "C:/SFTPfolder/"读取文件,而不是从项目路径读取它。 "new File(ackFileObject.getName().getPath());"也不创建新文件。

是否有一个简单的解决方案可以解决此问题?如何保存我从VFS.getManager().resolveFile()作为本地文件获得的FileObject,以便我可以将其解析为文档?

使用copyFrom()方法。您需要首先定义遥控器和本地路径:

您已经定义了远程文件:

    FileObject ackFileObject = VFS.getManager()
                   .resolveFile("sftp://user@sftp.server.com/SFTPfolder/file.xml");

现在定义要将远程路径复制到:

的路径
    FileObject ackFileObjectLocal = VFS.getManager()
                  .resolveFile(localFilePath);

您必须在哪里设置localFilePath变量或将其设置为常数。

然后使用:ackFileObjectLocal.copyFrom(ackFileObject, Selectors.SELECT_SELF);

现在,您已经下载了文件,并可以将其包装到文件对象中以进行处理。

最新更新