小坑集合

从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?