代码之家  ›  专栏  ›  技术社区  ›  D C

如何在没有jsch的情况下从SFTP客户端读取文件

  •  0
  • D C  · 技术社区  · 2 年前

    我正在尝试从SecureFTP客户端读取几个文件,以便运行每日报告任务:

    两个文件的文件内容( .bck 文件格式)在每一行中都是这样的

    |0000000 1|FirstName|LastName|Active |0001|00000000|
    |0000000 2|FirstName|LastName|Incctive|0002|0000000 1|
    |0000000 3|FirstName|LastName|Active |0003|00020002|

    到目前为止,我已经成功连接,能够读取文件名,但无法读取文件内容:

      import net.schmizz.sshj.SSHClient;
      import net.schmizz.sshj.sftp.SFTPClient;
      import net.schmizz.sshj.transport.verification.PromiscuousVerifier;
      import net.schmizz.sshj.sftp.RemoteFile.RemoteFileInputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.time.LocalDate;
      import java.time.format.DateTimeFormatter;
      import java.util.ArrayList;
      import java.util.List;
      import org.apache.commons.io.IOUtils;
    
      SSHClient ssh = new SSHClient();
      ssh.addHostKeyVerifier(new PromiscuousVerifier());
    
      try {
        ssh.connect("ServerName");
        ssh.authPassword("username", "password");
    
        SFTPClient sftp = ssh.newSFTPClient();
        List fileContentsList = new ArrayList();
    
        try {
          List files = sftp.ls("/");
          LocalDate yesterday = LocalDate.now().minusDays(1);
          DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
          boolean usFileFound = false;
          boolean caFileFound = false;
    
          for (file : files) {
            String fileName = file.getName();
    
            if (!file.isDirectory()) {
              if (fileName.contains("SAPHR_POS_CAEEMD_") && fileName.contains(yesterday.format(formatter)) && !caFileFound) {
                RemoteFile remoteFile = sftp.open(fileName); // Obtain the RemoteFile handle
                InputStream inputStream = new RemoteFileInputStream(remoteFile); // Get the input stream
                //List lines = Arrays.asList(fileContents.split("\n"));
                String fileContents = IOUtils.toString(inputStream, "UTF-8"); // Read contents as a string
                fileContentsList.add(fileContents); // Add the contents as string to the list
                caFileFound = true;
                remoteFile.close();
    
              } else if (fileName.contains("SAPHR_POS_USEEMD_") && fileName.contains(yesterday.format(formatter)) && !usFileFound) {
                RemoteFile remoteFile = sftp.open(fileName); 
                InputStream inputStream = new RemoteFileInputStream(remoteFile);
                String fileContents = IOUtils.toString(inputStream, "UTF-8");
                fileContentsList.add(fileContents);
                usFileFound = true;
                remoteFile.close();
              }
              if (caFileFound && usFileFound) {
                break; // Stop after both files found
              }
            }
          }
        } finally {
          sftp.close();
        }
    
        String result = String.join("\n", fileContentsList);
        return result;
      } finally {
        try {
          ssh.disconnect();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    

    当前代码的输出:

    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE List PUBLIC "sailpoint.dtd" "sailpoint.dtd">
    <List>
      <String>SAPHR_POS_CAEEMD_20230722.txt1690068889231.bck</String>
      <String>SAPHR_POS_USEEMD_20230722.txt1690068894774.bck</String>
    </List>
    

    尝试执行上面代码中的注释行时收到错误:

    Exception running rule: BeanShell script error: bsh.EvalError: Sourced file: inline evaluation of: 
    Author: user007 Date: 16-07-2023     Details: ********* . . . '' : Typed variable declaration : Error in method invocation: Method getInputStream(java.lang.String) not found in class'net.schmizz.sshj.sftp.SFTPClient' :
    at Line: 48 : in file: inline evaluation of:
    ``   /*********** Author: user007  Date: 16-07-2023  Details: ********* . . . '' : sftp .getInputStream ( fileName )   BSF info: usersReport
    at line: 0 column: columnNo
    
    0 回复  |  直到 2 年前
        1
  •  1
  •   Stephen C    2 年前

    我认为问题在于您使用的API不正确。

    如果你看看 examples 对于 SFTPClient ,他们不使用名为 getretrieveFileStream 事实上,API中没有一个方法的名称与此名称极为相似。调用不存在的方法是 从不 去上班。

    我建议你自己看看这些例子,看看它们是否符合你的要求。看看API的javadocs。例如:

    我怀疑提取文件内容的模式如下:

    1. 获得 SFTP客户端
    2. 呼叫 open 在客户端上获取 远程文件 要读取的文件的句柄。
    3. 使用该句柄作为外部类上下文,调用 RemoteFileInputStream 没有用于获取输入流的args构造函数。
    4. 以正常方式读取输入流
    5. 关闭流和手柄