Java下载FTP服务器上的资源,附带FTP工具类

通过xftp可以看到目标服务器上面的资源如下:
在这里插入图片描述

第一步:导入ftp依赖:

		 <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.7</version> <!-- 使用最新版本 --></dependency>

首先是通过原生代码来操作:
这里有个坑:如果是匿名登录,账号密码还是要的String username = "anonymous"即可,密码随意,直接上代码:

下载文件操作:

import com.example.demo.test1.utils.FtpUtil;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class test8 {public static void main(String[] args) throws Exception {String server = "ftp.ncbi.nlm.nih.gov";int port = 21;String username = "anonymous";String password = "your_password";FTPClient ftpClient = new FTPClient();ftpClient.connect(server, port);ftpClient.login(username, password);String remoteFilePath = "/pubmed/updatefiles/pubmed24n1220.xml.gz";String localFilePath = "D:\\BaiduNetdiskDownload\\pubmed24n1220.xml.gz";//设置本地被动模式ftpClient.enterLocalPassiveMode();ftpClient.setControlEncoding("UTF-8");// 设置二进制文件类型//ftpClient.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);try {// 创建本地文件输出流OutputStream outputStream = new FileOutputStream(localFilePath);// 从 FTP 服务器下载文件boolean success = ftpClient.retrieveFile(remoteFilePath, outputStream);if (success) {System.out.println("File downloaded successfully.");} else {System.out.println("File download failed.");}} catch (IOException e) {e.printStackTrace();} finally {// 关闭 FTP 连接ftpClient.logout();ftpClient.disconnect();}}
}

这里的远端路径和需要下载的本地路径我都提前把文件名拼上去了,根据需要可以动态拼接:下载结果:
在这里插入图片描述
查看文件目录操作:查看/pubmed下的目录:
在这里插入图片描述

public class test6 {public static void main(String[] args) throws Exception{String server = "ftp.ncbi.nlm.nih.gov";int port = 21;String username = "anonymous";String password = "your_password";String remoteFilePath2 = "/pubmed";FTPClient ftpClient = new FTPClient();try {ftpClient.connect(server, port);ftpClient.login(username, password);// 设置本地被动模式ftpClient.enterLocalPassiveMode();// 设置二进制文件类型ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 切换到指定文件夹ftpClient.changeWorkingDirectory(remoteFilePath2);// 使用listDirectories()获取目录列表FTPFile[] ftpDirectories = ftpClient.listDirectories();if (ftpDirectories != null && ftpDirectories.length > 0) {System.out.println("子目录列表:");for (FTPFile ftpDirectory : ftpDirectories) {System.out.println(ftpDirectory.getName());}} else {System.out.println("当前文件夹中没有子目录。");}} catch (IOException e) {e.printStackTrace();} finally {try {// 关闭 FTP 连接ftpClient.logout();ftpClient.disconnect();} catch (IOException e) {e.printStackTrace();}}}
}

在这里插入图片描述
查看目录下文件操作:查看/pubmed/updatefiles下的gz结尾文件
在这里插入图片描述

import com.example.demo.test1.utils.FtpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;import java.io.*;
@Slf4j
public class test5 {public static void main(String[] args) throws Exception {FTPClient ftpClient = FtpUtil.getFtpClient("ftp.ncbi.nlm.nih.gov", 21, "anonymous", "your_password");try {// 切换到指定文件夹String remoteFolder = "/pubmed/updatefiles";ftpClient.changeWorkingDirectory(remoteFolder);// 使用LIST命令获取详细文件列表String[] fileDetails = ftpClient.listNames();if (fileDetails != null && fileDetails.length > 0) {System.out.println("文件列表:");for (String fileDetail : fileDetails) {if (fileDetail.endsWith(".gz")) {System.out.println(fileDetail);}}} else {System.out.println("文件夹为空或没有权限查看文件列表。");}} catch (IOException e) {e.printStackTrace();} finally {// 关闭 FTP 连接FtpUtil.disConnect(ftpClient);}}}

在这里插入图片描述
这里的登录退出都是使用了FtpUtil工具类,方便很多,直接上工具类代码:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;import java.io.*;
import java.nio.charset.StandardCharsets;@Slf4j
public class FtpUtil {/*** 获取一个ftp连接* @param host ip地址* @param port 端口* @param username 用户名* @param password 密码* @return 返回ftp连接对象* @throws Exception 连接ftp时发生的各种异常*/public static FTPClient getFtpClient(String host, Integer port, String username, String password) throws Exception{FTPClient ftpClient = new FTPClient();// 连接服务器ftpClient.connect(host, port);int reply = ftpClient.getReplyCode();if(!FTPReply.isPositiveCompletion(reply)){log.error("无法连接至ftp服务器, host:{}, port:{}", host, port);ftpClient.disconnect();return null;}// 登入服务器boolean login = ftpClient.login(username, password);if(!login){log.error("登录失败, 用户名或密码错误");ftpClient.logout();ftpClient.disconnect();return null;}// 连接并且成功登陆ftp服务器log.info("login success ftp server, host:{}, port:{}, user:{}", host, port, username);// 设置通道字符集, 要与服务端设置一致ftpClient.setControlEncoding("UTF-8");// 设置文件传输编码类型, 字节传输:BINARY_FILE_TYPE, 文本传输:ASCII_FILE_TYPE, 建议使用BINARY_FILE_TYPE进行文件传输ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 动模式: enterLocalActiveMode(),被动模式: enterLocalPassiveMode(),一般选择被动模式ftpClient.enterLocalPassiveMode();// 切换目录//ftpClient.changeWorkingDirectory("xxxx");return ftpClient;}/*** 断开ftp连接* @param ftpClient ftp连接客户端*/public static void disConnect(FTPClient ftpClient){if(ftpClient == null){return;}try {log.info("断开ftp连接, host:{}, port:{}", ftpClient.getPassiveHost(), ftpClient.getPassivePort());ftpClient.logout();ftpClient.disconnect();} catch (IOException e) {e.printStackTrace();log.error("ftp连接断开异常, 请检查");}}/*** 文件下载* @param ftpClient ftp连接客户端* @param path 文件路径* @param fileName 文件名称*/public static void download(FTPClient ftpClient, String path, String fileName) throws Exception {if(ftpClient == null || path == null || fileName == null){return;}// 中文目录处理存在问题, 转化为ftp能够识别中文的字符集String remotePath;try {remotePath = new String(path.getBytes(StandardCharsets.UTF_8), FTP.DEFAULT_CONTROL_ENCODING);} catch (UnsupportedEncodingException e) {remotePath = path;}InputStream inputStream = ftpClient.retrieveFileStream(remotePath);if (inputStream == null) {log.error("{}在ftp服务器中不存在,请检查", path);return;}FileOutputStream outputStream = new FileOutputStream(fileName);BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);try{byte[] buffer = new byte[2048];int i;while ((i = bufferedInputStream.read(buffer)) != -1) {bufferedOutputStream.write(buffer, 0, i);bufferedOutputStream.flush();}} catch (Exception e) {log.error("文件下载异常", e);log.error("{}下载异常,请检查", path);}inputStream.close();outputStream.close();bufferedInputStream.close();bufferedOutputStream.close();// 关闭流之后必须执行,否则下一个文件导致流为空boolean complete = ftpClient.completePendingCommand();if(complete){log.info("文件{}下载完成", remotePath);}else{log.error("文件{}下载失败", remotePath);}}/*** 上传文件* @param ftpClient ftp连接客户端* @param sourcePath 源地址*/public static void upload(FTPClient ftpClient, String sourcePath) throws Exception{if(ftpClient == null || sourcePath == null){return;}File file = new File(sourcePath);if(!file.exists() || !file.isFile()){return;}// 中文目录处理存在问题, 转化为ftp能够识别中文的字符集String remotePath;try {remotePath = new String(file.getName().getBytes(StandardCharsets.UTF_8), FTP.DEFAULT_CONTROL_ENCODING);} catch (UnsupportedEncodingException e) {remotePath = file.getName();}try(InputStream inputStream = new FileInputStream(file);OutputStream outputStream = ftpClient.storeFileStream(remotePath);){byte[] buffer = new byte[2048];int length;while((length = inputStream.read(buffer)) != -1){outputStream.write(buffer, 0, length);outputStream.flush();}}catch (Exception e){log.error("文件上传异常", e);}// 关闭流之后必须执行,否则下一个文件导致流为空boolean complete = ftpClient.completePendingCommand();if(complete){log.info("文件{}上传完成", remotePath);}else{log.error("文件{}上传失败", remotePath);}}
}

参考链接:Java从ftp服务器上传与下载文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/243783.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch 内 LibTorch/TorchScript 的使用

PyTorch 内 LibTorch/TorchScript 的使用 1. .pt .pth .bin .onnx 格式1.1 模型的保存与加载到底在做什么&#xff1f;1.2 为什么要约定格式&#xff1f;1.3 格式汇总1.3.1 .pt .pth 格式1.3.2 .bin 格式1.3.3 直接保存完整模型1.3.4 .onnx 格式1.3.5 jit.trace1.3.6 jit.scrip…

了解云工作负载保护:技术和最佳实践

云工作负载是指云环境中的应用程序或存储元素&#xff0c;无论是公共云、私有云还是混合云。每个云工作负载都使用云的资源&#xff0c;包括计算、网络和存储。 云工作负载可以多种多样&#xff0c;例如运行应用程序、数据库或托管网站。它们可以是静态的或动态的&#xff0c;…

mysql 导入数据 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘

前言: mysql 导入数据 遇到这个错误 1273 - Unknown collation: utf8mb4_0900_ai_ci 具体原因没有深究 但应该是设计数据库的 字符集类型会出现这个问题 例如: char varchar text..... utf8mb4 类型可以存储表情 在现在这个时代会用很多 以后会用的更多 所以不建议改…

LabVIEW滚动轴承故障在线监测

展示了如何将LabVIEW开发出一种有效的滚动轴承故障在线监测系统。介绍了该系统的开发过程、工作原理及其在实际应用中的效果。该系统成功地应用于对滚动轴承故障的早期诊断&#xff0c;提高了故障检测的准确性和效率。 滚动轴承在工作过程中会产生复杂的振动信号&#xff0c;包…

【C语言进阶】预处理详解

引言 对预处理的相关知识进行详细的介绍 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 预定义符号 #define定义常量 #define定义宏 带有副作用的宏参数 宏替换的规则 …

开源的测试平台快2千星了,能带来多少收益呢

最近看了下自己去年初开源的测试平台&#xff0c;star一起算的话也到1.7k了&#xff1a; 做开源的初心一方面是想把自己的理解和思想展示出来&#xff0c;另一方面是想进一步打造个人IP&#xff0c;提升影响力&#xff08;其实这个想法很早之前就有了&#xff0c;计划过无数次但…

【BERT】详解

BERT 简介 BERT 是谷歌在 2018 年时提出的一种基于 Transformer 的双向编码器的表示学习模型&#xff0c;它在多个 NLP 任务上刷新了记录。它利用了大量的无标注文本进行预训练&#xff0c;预训练任务有掩码语言模型和下一句预测&#xff0c;掩码语言模型指的是随机地替换文本中…

「云渲染C4D」C4D如何进行云渲染?

云渲染C4D的过程可现实一键式完成&#xff0c;目前云渲染平台随着技术的发展&#xff0c;平台的使用越发容易操作&#xff0c;无论是渲染文件的传输性、安全性、高效性都有较大的提升&#xff0c;本次为大家简单说明下关于云渲染操作方法。 &#xff08;图源网络&#xff09; …

Android状态栏布局隐藏的方法

1.问题如下&#xff0c;安卓布局很不协调 2.先将ActionBar设置为NoActionBar 先打开styles.xml 3.使用工具类 package com.afison.newfault.utils;import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.graph…

“深入理解 Docker 和 Nacos 的单个部署与集成部署“

目录 引言&#xff1a;Docker Nacos 单个部署1.1 什么是 Docker&#xff1f;Docker 的概念和工作原理Docker 为什么受到广泛应用和认可 1.2 什么是 Nacos&#xff1f;Nacos 的核心功能和特点Nacos 在微服务架构中的作用 1.3 Docker 单个部署 Nacos Docker Nacos 集成部署总结&a…

如何使用固定公网地址访问多个本地Nginx服务搭建的网站

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 本文主要介绍如何在Windows系统对Nginx进行配置&#xff0c;并结合cpolar内网穿透工具实现固定公网地址远程访问多个本地站…

Spring Boot整合Redis的高效数据缓存实践

引言 在现代Web应用开发中&#xff0c;数据缓存是提高系统性能和响应速度的关键。Redis作为一种高性能的缓存和数据存储解决方案&#xff0c;被广泛应用于各种场景。本文将研究如何使用Spring Boot整合Redis&#xff0c;通过这个强大的缓存工具提高应用的性能和可伸缩性。 整合…

操作系统导论-课后作业-ch14

1. 代码如下&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {int *i NULL;free(i);return 0; }执行结果如下&#xff1a; 可见&#xff0c;没有任何报错&#xff0c;执行完成。 2. 执行结果如下&#xff1a; 3. valgrind安装使用参考&a…

接口自动化测试(Python+Requests+Unittest)

(1)接口自动化测试的意义、前后端分离思想 接口自动化测试的优缺点&#xff1a; 优点&#xff1a; 1、测试复用性。 2、维护成本相对UI自动化低一些。 为什么UI自动化维护成本更高&#xff1f; 因为前端页面变化太快&#xff0c;而且UI自动化比较耗时&#xff08;比如等待页…

常见PCB封装

表面贴片封装 通孔封装 公众号 | FunIO 微信搜一搜 “funio”&#xff0c;发现更多精彩内容。 个人博客 | blog.boringhex.top

基于神经网络的电力系统的负荷预测

一、背景介绍&#xff1a; 电力系统负荷预测是生产部门的重要工作之一&#xff0c;通过准确的负荷预测&#xff0c;可以经济合理地安排机组的启停、减少旋转备用容量、合理安排检修计划、降低发电成本和提高经济效益。负荷预测按预测的时间可以分为长期、中期和短期负荷预测。…

使用pysimplegui+opencv编写一个摄像头的播放器

需求 使用pysimplegui和opencv实现一个播放器&#xff0c;播放 摄像头的画面。 代码实现 import cv2 import time from typing import Iterable, NamedTuple, Optionalimport PySimpleGUI as sgclass CameraSpec(NamedTuple):name: strindex: intwidth: intheight: intfps: i…

记一次 stackoverflowerror 线上排查过程

一.线上 stackOverFlowError xxx日,突然收到线上日志关键字频繁告警 classCastException.从字面上的报警来看,仅仅是类型转换异常,查看细则发现其实是 stackOverFlowError.很多同学面试的时候总会被问到有没有遇到过线上stackOverFlowError?有么有遇到栈溢出?具体栈溢出怎么来…

网络爬虫采集工具

在当今数字化的时代&#xff0c;获取海量数据对于企业、学术界和个人都至关重要。网络爬虫成为一种强大的工具&#xff0c;能够从互联网上抓取并提取所需的信息。本文将专心分享关于网络爬虫采集数据的全面指南&#xff0c;深入探讨其原理、应用场景以及使用过程中可能遇到的挑…

【论文阅读笔记】Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation

1.介绍 Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation Swin-Unet&#xff1a;用于医学图像分割的类Unet纯Transformer 2022年发表在 Computer Vision – ECCV 2022 Workshops Paper Code 2.摘要 在过去的几年里&#xff0c;卷积神经网络&#xff…