如何将SFTP中的FileObject保存为本地文件?

时间:2017-12-19 11:22:48

标签: java xml sftp vfs

我想编写一个java程序来测试一个接口,它通过SFTP上的xml文件进行通信。接口的想法是一方上传一个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,因为documentBuilder尝试从"C:/SFTPfolder/"读取文件,而不是从项目路径中读取它。另外"new File(ackFileObject.getName().getPath());"不会创建新文件。

有一个简单的解决方案来解决这个问题吗?如何将FileObject作为本地文件从VFS.getManager().resolveFile()保存,以便将其解析为文档?

1 个答案:

答案 0 :(得分:2)

使用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);

现在您已经下载了文件,可以使用File对象将其包装起来继续处理。