如何从SFTP服务器获取文件列表?

我有一个问题,希望得到一个解决方案。 我也写了一些代码,但需要进行一些修改。

问题:我需要连接的SFTP服务器(出于隐私目的,我将提供虚拟凭据)。

服务器名称:服务器名称端口:22用户名:用户名密码:密码

当我连接到服务器时,它会自动将我放入“/ FGV”目录中。 在这个目录里面是其他几个文件夹。 我需要从“/ FGV / US / BS /”目录中获取xml消息列表,并将它们放在LIST(文件forms的文件)中。 在列表中,我需要有文件目录,文件名和文件正文。 我正在考虑创建一个对象并将此信息放在那里并创建该对象的List。

我当前的代码创建一个连接并仅下载一个xml文件。 如果有两个xml文件,那么我本地计算机中的文件没有任何内容。

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; public class SFTPinJava { public SFTPinJava() { } public static void main(String[] args) { String SFTPHOST = "server-name"; int SFTPPORT = 22; String SFTPUSER = "username"; String SFTPPASS = "password"; String SFTPWORKINGDIR = "/FGV"; Session session = null; Channel channel = null; ChannelSftp channelSftp = null; try { JSch jsch = new JSch(); session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT); session.setPassword(SFTPPASS); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); channel = session.openChannel("sftp"); channel.connect(); channelSftp = (ChannelSftp) channel; channelSftp.cd(SFTPWORKINGDIR); byte[] buffer = new byte[1024]; BufferedInputStream bis = new BufferedInputStream( channelSftp.get("/FGV/US/BS/FGVCustomsEntryLoaderService.xml")); File newFile = new File( "C:\\workspace\\Crap\\src\\org\\raghav\\stuff\\XML_FROM_SERVER.xml"); OutputStream os = new FileOutputStream(newFile); BufferedOutputStream bos = new BufferedOutputStream(os); int readCount; //System.out.println("Getting: " + theLine); while ((readCount = bis.read(buffer)) > 0) { //System.out.println("Writing: "); bos.write(buffer, 0, readCount); } while(session != null){ System.out.println("Killing the session"); session.disconnect(); bis.close(); bos.close(); System.exit(0); } } catch (Exception ex) { ex.printStackTrace(); } } 

}

我需要更改此代码,以便它可以获取多个文件并将它们放在对象列表中。 该对象应该具有文件的目录,文件名和文件正文。

有人可以帮帮我吗?

提前致谢。

您可以使用列出给定目录中的所有文件

 Vector list = channelSftp.ls("*.csv"); for(ChannelSftp.LsEntry entry : list) { System.out.println(entry.getFilename()); } 

之后添加此代码

 channelSftp.cd(SFTPWORKINGDIR); 

现在你将获得文件对象列表。 如果要下载所有文件,则文件对象为entry。 将此代码添加到for循环中。

 byte[] buffer = new byte[1024]; BufferedInputStream bis = new BufferedInputStream(channelSftp.get(entry.getFilename())); File newFile = new File("C:/Users/Desktop/sftpStuff/"+entry.getFilename()); OutputStream os = new FileOutputStream(newFile); BufferedOutputStream bos = new BufferedOutputStream(os); int readCount; //System.out.println("Getting: " + theLine); while( (readCount = bis.read(buffer)) > 0) { System.out.println("Writing: "+entry.getFilename() ); bos.write(buffer, 0, readCount); } bis.close(); bos.close(); 

这是列出目标目录文件的一种方法。

 Vector filelist = channelSftp.ls(SFTPWORKINGDIR); for(int i=0; i 

其次,在for循环中,如果需要xml文件,则可以下载所有文件。

ChannelSftp有一种从路径获取文件列表的方法。 我假设您要下载的文件都在同一目录中并且您将执行以下操作:

 channelSftp.cd("/FGV/US/BS/"); Vector ls = channelSftp.ls("*") 

http://epaul.github.io/jsch-documentation/simple.javadoc/com/jcraft/jsch/ChannelSftp.html#ls(java.lang.String)

获得该列表(返回Vector)后,设置for循环或迭代器以使用Vector中的每个ChannelSftp.LsEntry,使用getFilename方法获取文件名。 您可以检查以确保它具有.xml扩展名。 代码中byte[] buffer行的所有内容都在循环内部。 如果要保留文件的内容,则需要向缓冲区添加连续读取到StringBuffer。

至于存储文件名,每个文件的内容和目录,您可以使用一个简单的包装器。 例:

 public class SFTPFileList { public String directory; public ArrayList filenames; public ArrayList fileContents; /** *Simple method to add a filename and its contents. *filenames and fileContents will have the same index *for filename<->content. **/ public void addFile(String filename, StringBuffer content) { filenames.add(filename); fileContents.add(content); } } 

您可以添加方法,构造函数等来正确获取,设置。 或直接访问。 对于后者,在你的循环之外:

 SFTPFileList sftpFileList = new SFTPFileList(); sftpFileList.directory = "/FGV/US/BS/"; ArrayList fileNames = new ArrayList<>(); ArrayList contents = new ArrayList<>(); sftpFileList.filenames = filenames; sftpFileList.contents = contents; 

在你的循环内:

 ChannelSftp.LsEntry entry = iter.next(); //or from a for loop String fileName = entry.getFileName(); StringBuffer fileContent = new StringBuffer(); //this where you will add the results of each read -> buffer ... read content ... sftpFileList.addFile(fileName,fileContent); 

然后在循环之外,您可以通过另一种可以编写的方法访问所有文件名及其内容。 或者根据需要直接访问这些成员。