小坑集合
从ftp下载文件
切记不要将获取到的流,再次转化为字节流,这样会使文件在内存中存在一份,文件过大时,内存溢出。
正确方法是建立起一个从ftp拉取数据,返回给下游的流管道。
//ftp登录
ftpHelper.loginFtpServer(host, username, password, port, timeout, connectPattern);
//获取文件流
InputStream fileInputStream = ftpHelper.getInputStream(fileName);
//响应体
HttpServletResponse response;
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
try {
out = response.getOutputStream();
int len = 0;
//8MB
byte[] buffer = new byte[8 * 1024 * 1024];
while ((len = fileInputStream.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.flush();
} catch (Exception e) {
log.error("responseFileStream error:", e);
} finally {
if (out != null) {
out.close();
}
if (fileInputStream != null) {
fileInputStream.close();
}
}
ftp的连接
一个正确的JSch的连接流程,包含JSch客户端的创建,使用和销毁。包含Session和ChannelSftp的创建,因此销毁的时候,需要销毁Session和ChannelSftp。切记不要将这2个对象放在静态类中,导致一直无法销毁,重复使用,从而出现一些异常的现象。
JSch jsch = new JSch();
Session session = null;
ChannelSftp channelSftp = null;
try {
session = jsch.getSession(username, host, 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(password);
session.connect();
channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
try {
channelSftp.lstat(filePath);
return true;
} catch (SftpException e) {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (channelSftp != null) {
channelSftp.exit();
}
if (session != null) {
session.disconnect();
}
}
读写分离的mysql,插入数据
读写分离的数据库,刚把数据插入后,立马查询,是有一定几率查询不到的。应避免这种操作。如果后续想使用刚插入的数据,应该在插入之前就把数据报错到内存中。
循环里面删除数据
一边循环,一遍删除数据,会导致数组下标错乱。可以使用迭代器的方式来实现次功能。
Last updated
Was this helpful?