上传和下载文件时使用内存泄漏(可能是因为使用 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。
能否介绍一下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。