Java怎么读取传输FTP文件
一.需求
FTP作为文件服务器,由提供服务方提供远程连接地址,连接端口,账号,密码等信息。
根据以上信息可以建立客户端连接,随后对于建立好的连接可进行文件读取,文件上传等操作
二.依赖
<!-- FTP相关操作的依赖 --> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.9.0</version> </dependency> <!-- IO工具类的依赖 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> <!-- lombok依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.26</version> <scope>provided</scope> </dependency>
三.关键源码
3.0 配置信息
ftp: config: host: ${env.ftp.config.host:10.1.1.1} port: ${env.ftp.config.port:12345} username: ${env.ftp.config.username:ftpUsername} password: ${env.ftp.config.password:ftpPwd} remote-dir-path: ${env.ftp.config.remote-dir-path:/}
/** * @author: Vainycos * @description ftp配置信息 * @date: 2023/4/17 15:16 */ @Data @Component @ConfigurationProperties("ftp.config") public class FtpConfig { private String host; private int port; private String username; private String password; /** 初始读取根目录,当前默认/ */ private String remoteDirPath; }
3.1 获取客户端
/** * 获取ftp客户端 * @return */ public FTPClient getFtpClient(){ try { FTPClient ftpClient = new FTPClient(); ftpClient.connect(ftpConfig.getHost() ,ftpConfig.getPort()); // 10分钟连接时间 ftpClient.setConnectTimeout(600000); ftpClient.setDefaultTimeout(600000); ftpClient.login(ftpConfig.getUsername() ,ftpConfig.getPassword()); // login后设置传输的模式 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // login后设置被动模式 ftpClient.enterLocalPassiveMode(); // login后设置编码 String LOCAL_CHARSET = "GBK"; // 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK). if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) { LOCAL_CHARSET = "UTF-8"; } ftpClient.setControlEncoding(LOCAL_CHARSET); if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { log.error("未连接到FTP,用户名或密码错误!"); ftpClient.disconnect(); } else { log.info("FTP连接成功!"); } // 切换从某个根目录下开始扫描 ftpClient.changeWorkingDirectory(ftpConfig.getRemoteDirPath()); return ftpClient; }catch (IOException e) { log.error("ftp建立连接异常->{}", e); } return null; }
3.2 获取ftp文件
/** * 获取对应目录下的第一级目录文件 * @param ftpClient client * @throws IOException */ public void getFtpFirstDirectoryFiles(FTPClient ftpClient) throws IOException { log.info("ftpclient当前工作目录->{}", ftpClient.printWorkingDirectory()); if (ftpClient != null) { FTPFile[] files = ftpClient.listFiles(); for (FTPFile file : files) { String fileName = file.getName(); if (file.isDirectory()){ // 每次从根目录下查找第一级目录 String firstDirectory = ftpConfig.getRemoteDirPath() + "/" + fileName; ftpClient.changeWorkingDirectory(firstDirectory); log.info("当前目录->{}, 开始扫描录音文件", firstDirectory); // 切换目录后直接遍历第一级的文件,不递归第二级目录 dealFile(ftpClient); log.info("{}->目录扫描结束", firstDirectory); } } } } /** * 处理目录下的文件 * @param ftpClient * @throws IOException */ public void dealFile(FTPClient ftpClient) throws IOException { FTPFile[] files = ftpClient.listFiles(); for (FTPFile file : files) { String fileName = file.getName(); if (file.isDirectory()) { log.info("{}->为目录,跳过", fileName); continue; } String rootWorkingDirectory = ftpClient.printWorkingDirectory(); log.info("获取到文件->{}, 开始获取ftp文件流, ftpclient工作目录->{}", fileName, ftpClient.printWorkingDirectory()); // 开始获取ftp文件流 InputStream inputStream = ftpClient.retrieveFileStream(new String(fileName.getBytes("UTF-8"), FTP.DEFAULT_CONTROL_ENCODING)); if (inputStream == null){ log.error("文件不存在->{}", fileName); return; } byte[] data = IOUtils.toByteArray(inputStream); inputStream.close(); // 关键代码,如果不执行该代码,后续的ftpClient操作将会不生效 ftpClient.completePendingCommand(); // 省略...获取到了inputStream 文件流进行后续处理 } }
3.3 关闭ftp服务连接
/** * 关闭FTP服务连接 * @param ftpClient */ public void disConnection(FTPClient ftpClient) { try{ if(ftpClient.isConnected()){ ftpClient.disconnect(); } }catch(IOException e) { log.error("ftpClient.disconnect失败->{}", e); } }
以上是Java怎么读取传输FTP文件的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4

Java是热门编程语言,适合初学者和经验丰富的开发者学习。本教程从基础概念出发,逐步深入讲解高级主题。安装Java开发工具包后,可通过创建简单的“Hello,World!”程序实践编程。理解代码后,使用命令提示符编译并运行程序,控制台上将输出“Hello,World!”。学习Java开启了编程之旅,随着掌握程度加深,可创建更复杂的应用程序。
