一、开发环境
1.IDE:IDEA 2017
2.JDK:1.8
3.浏览器:谷歌浏览器
4.框架:springboot
5.数据库:Oracle
二、业务背景
数据采集处理程序,需要每天定时从ftp服务器上采集一个以日期(yyyymmdd.dat)命名的文件,每天会定时上传一个新的文件到ftp服务器上。
任务:使用程序连接ftp服务器,并且读取到当天上传的文件并解析成指定格式将数据存储到数据库中。
三、项目结构
四、pom依赖
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--连接ftp-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
五、配置文件application.yml
spring:
datasource:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@127.0.0.1:1521/ORCL
username: root
password: root
max-active: 5
validation-query: SELECT 'x' FROM DUAL
test-on-borrow: true
jpa:
generate-ddl: true
ftp:
# FTP地址
ftpAddress: xxx.xx.xx.xxx
# FTP端口
ftpPort: xxxx
# FTP帐号
ftpUsername: test
# FTP密码
ftpPassword: test
logging:
path: ./logs
level:
root: info
server:
port: 8845
#定时调度采集频率(此处是每晚8点采集一次)
taskCorn: 0 0 20 * * ?
六、springboot启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
//定时调度需要
@EnableScheduling
//Jpa需要
@EnableJpaAuditing
@EntityScan("com.demo.data.entity")
@EnableJpaRepositories("com.demo.data.dao")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
七、FtpUtil工具类
此工具类整合了登录ftp服务器与读取ftp服务器文件的方法:
package com.demo.data.util;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class FtpUtil {
/** FTP地址 **/
private String ftpAddress;
/** FTP端口 **/
private int ftpPort = 0;
/** FTP用户名 **/
private String ftpUsername;
/** FTP密码 **/
private String ftpPassword;
/** FTP基础目录 **/
private String basePath = "/";
/** 初始化登录ftp 默认false 登录成功返回true **/
private Boolean b = false;
public Boolean getB() {
return b;
}
/**
* 2018-6-13 12:39:55
* 新添,初始化登录ftp,连接失败 返回b 为:false ,成功 为 :true
* @param ftpUsername
* @param ftpPassword
* @param basePath
*/
public FtpUtil(String ftpAddress, int ftpPort, String ftpUsername, String ftpPassword, String basePath) {
this.ftpAddress = ftpAddress;
this.ftpPort = ftpPort;
this.ftpUsername = ftpUsername;
this.ftpPassword = ftpPassword;
this.basePath = basePath;
b = login(ftpAddress, ftpPort, this.ftpUsername, this.ftpPassword);
}
/** 本地字符编码 **/
private static String localCharset = "GBK";
/** FTP协议里面,规定文件名编码为iso-8859-1 **/
private static String serverCharset = "ISO-8859-1";
/** UTF-8字符编码 **/
private static final String CHARSET_UTF8 = "UTF-8";
/** OPTS UTF8字符串常量 **/
private static final String OPTS_UTF8 = "OPTS UTF8";
/** 设置缓冲区大小 **/
private static final int BUFFER_SIZE = 1024 * 1024 * 10;
/** FTPClient对象 **/
private static FTPClient ftpClient = null;
/**
* 下载指定文件到本地
*
* @param ftpPath FTP服务器文件相对路径,例如:test/123
* @param fileName 要下载的文件名,例如:test.txt
* @param savePath 保存文件到本地的路径,例如:D:/test
* @return 成功返回true,否则返回false
*/
public boolean downloadFile(String ftpPath, String fileName, String savePath) {
// 登录
boolean flag =