上传和下载文件时使用内存泄漏(可能是因为使用 ChannelSftp.get( "file_name") )?

Memory leak using while uploading and downloading a file (may be because of using ChannelSftp.get( "file_name") )?

能否介绍一下ChannelSftp.get( "file_name")的内部工作原理?如果经常使用此功能,使用此功能从文件列表(600 个 10 kb 的文件)中获取单个文件会导致 Tomcat8 中出现内存泄漏问题吗?

这是用于从远程服务器上传和获取文件的代码。

public String connectRemote(String host, String user, String password, String 
    remotePath, String sFileName) throws IOException, JSchException, SftpException 
{
    try {
        String sFileNames ="";
        Session session = connectSFTP(host, user, password);

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp chan = (ChannelSftp) channel;

        try {

            String ftpRemoteDirectory = "/Irismedical/Outbox_Eligibility";

            chan.cd(ftpRemoteDirectory);

            File ftest = new File(sFileName);

            chan.put(new FileInputStream(ftest), ftest.getName());

            sFileNames =  ftest.getName();

        }
        catch (Exception e) {
            chan.disconnect();
            session.disconnect();
            return null;
        }

        chan.cd("/Irismedical/Inbox/Eligibility");

        String sRes = null;
        for (int i = 0;i<6 ; i++) {

            try {
                  sRes = convertInputStreamToString(
                             chan.get(sFileNames+"_Response_271_1.edi"));

                 if (sRes  != null ) {

                     break;

            } catch (Exception e ) {
                if (i<3) {
                    Thread.sleep(3000);
                } else {
                    Thread.sleep(5000);
                }
            }
        }
                    session.disconnect();

        return sRes;
    }
    catch (Exception e) {
        }
        return null;
    }
}

private static String convertInputStreamToString(InputStream inputStream) 
    throws IOException {

    ByteArrayOutputStream result = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) != -1) {
        result.write(buffer, 0, length);
    }

    return result.toString(StandardCharsets.UTF_8.name());
}

您必须处理流。

上传代码中的 FileInputStream 和下载代码中 ChannelSftp.get 返回的 InputStream

Disposing streams in Java