【问题标题】:Send SFTP file from database without actually creating a file从数据库发送 SFTP 文件而不实际创建文件
【发布时间】:2025-12-07 16:00:02
【问题描述】:

我想从数据库中发送一些数据。目前我们的 SFTP 是这样设置的(使用 apache commons vsf2 库)。

    try(StandardFileSystemManager manager = new StandardFileSystemManager())
        File file = generateFileFromDatabase();
        manager.init();
   
        FileSystemOptions opts = new FileSystemOptions();
        SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(
                opts, "no");
        SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
        SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000);

        // Create localfile object
        FileObject localFile = manager.resolveFile(file.getAbsolutePath());

        // Create remote file object
        FileObject remoteFile = manager.resolveFile(sftpUri, opts);

        // Copy local file to sftp server
        remoteFile.copyFrom(localFile, Selectors.SELECT_SELF);


    } catch (Exception ex) {
        ex.printStackTrace();
    }

但是,generateFileFromDatabase() 通过调用 new 关键字来工作,如

       return new File();

我不想要这个,因为每次调用 generateFileFromDatabase() 时都会在文件系统中保存一个新文件。有没有办法在不保存到文件目录的情况下生成File()

【问题讨论】:

    标签: java sftp apache-commons-vfs


    【解决方案1】:

    随便用

    OutputStream os = remoteFile.getContent().getOutputStream();
    

    然后循环写入它,就像使用本地文件一样。

    这可能是长时间打开连接的缓慢读取/大量传输的问题。在这种情况下,您可能需要预先生成块并将它们写入多个追加。

    【讨论】: