java连接ftp并读取解析上面的文件

一、开发环境

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 = 
  • 7
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
可以使用Apache Commons Net库来读取FTP上的文件。以下是一个示例代码: ``` import java.io.IOException; import java.io.InputStream; import org.apache.commons.net.ftp.FTPClient; public class FTPExample { public static void main(String[] args) { String server = "ftp.example.com"; int port = 21; String user = "username"; String password = "password"; String filePath = "/path/to/file.txt"; FTPClient ftpClient = new FTPClient(); try { // 连接FTP服务器 ftpClient.connect(server, port); ftpClient.login(user, password); // 设置文件类型为二进制 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 从FTP服务器获取文件流 InputStream inputStream = ftpClient.retrieveFileStream(filePath); // 处理文件流,例如读取文件内容 byte[] buffer = new byte[1024]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { String fileContent = new String(buffer, 0, bytesRead); System.out.println(fileContent); } // 关闭文件流和FTP连接 inputStream.close(); ftpClient.logout(); ftpClient.disconnect(); } catch (IOException ex) { ex.printStackTrace(); } } } ``` 在这个示例,我们首先使用`FTPClient`类连接FTP服务器,并使用`login`方法进身份验证。接下来,我们设置文件类型为二进制,并使用`retrieveFileStream`方法获取FTP服务器上指定文件的输入流。最后,我们可以从文件读取文件内容。在完成操作后,我们要记得关闭文件流和FTP连接

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值