【开发心得】Java ftp开发注意事项

news2025/8/6 2:03:11

前言:

    虽说已经2022年了,但是ftp上传方式还是有一定使用场景的,关于java的ftp上传下载实现,基本都指向了apache commont net 库。

代码实现可以参考:
https://blog.csdn.net/tianshan2010/article/details/103690940

或者其他类似的文章,基础使用大同小异,本文重点讨论可能遇到的坑。

1. completePendingCommand 造成的坑

注意,如果断点上传可以使用 storeFileStream

public boolean storeFile(String remote, InputStream local)
public OutputStream storeFileStream(String remote)

注意,先outputStream close之后才能调用 completePendingCommand,否则会卡住,有文章说,如果上传路径没有权限,无法创建output对象,也有可能卡住,需要注意下。

断点下载可以使用 retrieveFileStream

public boolean retrieveFile(String remote, OutputStream local)
public InputStream retrieveFileStream(String remote)

注意,先inputStream close之后才能调用 completePendingCommand,否则会卡住

除了先关闭之外,一定要确定远程文件存在且能访问,否则inputStream为null,无法调用close,就会卡住。

FTPClient中使用completePendingCommand方法注意事项 - 爱码网方法介绍: * There are a few FTPClient methods that do not complete the * entire sequence of FTP commands to complete a transaction. These * commands require some action by the programmer aftehttps://www.likecs.com/show-305874415.html

2. 如何终止 ftp上传或者下载?

博主实践的逻辑是,使用断点续传的两组方法,外部传递listener 抽象接口,监听stop时机,在流拷贝的时候,关闭输入输出流,并使用ftpclient.abort()方法。

注意,ftpclient.abort() 要在传输结束的时候才会执行,所以要先close 底层实际上发送的是abor命令,可以断点看看。

3.  中文名称无法下载或者上传出现中文乱码?

核心原因是字符集问题,ftp默认传输使用的字符集是iso-8859-1,需要设置下字符集。

注意,一定不要直接设置 直接设置如下,GBK或者UTF-8,需要根据你的ftpserver来,或者干脆去做下推测。

错误示范:

ftpClient.appendFileStream(new String(remoteFullPath.getBytes("GBK"), "iso-8859-1"));

正确示范:

  private Boolean getEncodingUtf8(FTPClient ftpClient) {
        Boolean result = false;
        try {
            if (ftpClient != null) {
                if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
                        "OPTS UTF8", "ON"))) {
                    result = true;
                }
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return result;
    }

 通过执行上述方法获取到encoding,并且getBytes即可,上传下载都一样。

4. 文件大小下载或者上传不一致。

ftpClient.login(username, password);             ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 

注意,一定要在login之后在设置FileType,否则会不生效。

原因如下:

FTP的传输有两种方式: ASCII传输模式和二进制数据传输模式。

**1.ASCII传输方式:**假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。

但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。

2.二进制传输模式: 在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。

如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)

5.  如果使用连接池(apache pool2) 一定记得归还,并且设置超时配置。

setMaxWaitMillis 最大租用超时时间。这个也可以避免使用池化技术的时候,问题1

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云服务--漏洞修复

1、Spring Security 身份认证绕过漏洞(CVE-2022-22978) Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。 Spring Security存在身份认证绕过漏洞 ,当Spring Security中使用RegexRequestMatcher进行权限配置&#…

汽车云算力“竞速”,个性化进阶成新风向

配图来自Canva可画 随着产业互联网的持续推进,云服务逐渐深入各行各业,云服务厂商也专门推出各种面向特定行业的专属云,比如金融云、零售云、政务云等等。如今云服务厂商正把焦点深入到汽车领域,围绕“汽车云”展开新的角逐。 今…

LeetCode[662]二叉树的最大宽度

难度:中等 题目: 给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 描述: 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长…

麦子-linux驱动策略与框架

一、linux内核同步和互斥 信号量(进程与进程) 当进程A执行共享资源先加锁执行down表示占用资源,进程B想执行就会被dowm,导致陷入睡眠 当进程A行完了就会up释放资源,我们其他线程执行这个共享资源就不会被dowm睡眠 自旋…

蓝桥杯入门即劝退(十)反转链表

----------持续更新蓝桥杯入门系列算法实例------------ 如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流! 你的点赞、关注、评论、是我创作的动力! -------希望我的文章对你有所帮助-------- 前言:如果有一定链表基础&#…

【图像处理】基于形状提取和模式匹配组合的面部特征点提取方法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

7天酒店斩获五洲钻石奖“年度投资价值酒店连锁品牌” 打造酒店投资极致性价比

近日,“2022文旅国际峰会暨第十五届世界酒店论坛”在海南隆重召开,300多位来自中外的业界精英和跨界企业家代表等受邀参加,齐聚行业盛会。同期,“第十四届五洲钻石奖”也正式揭晓,7天酒店在众多品牌中脱颖而出&#xf…

【原创】使用Golang的电商搜索技术架构实现

作者:黑夜路人 时间:2022年11月 一、背景: 现在搜索技术已经是非常主流的应用技术,各种优秀的索引开源软件已经很普遍了,比如 Lucene/Solr/Elasticsearch 等等主流搜索索引开源软件,让我们搭建一个优秀的…

项目管理如何有效进行?看这篇就够了

先放上一个项目管理流程图,纯手打,图有点长。 ​ 上面的流程图其实就已经清楚概括了项目管理的流程框架,按照这个逻辑去推进,一般来说就可以达到标准化的要求了。 将以上流程细化成具体的项目管理场景,大致可以分为7大…

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day08

大家好,我是陶然同学,软件工程大三明年实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题🙃🙃。 不敢苟同,相信大…

6种MySQL数据库平滑扩容方案剖析

1. 扩容方案剖析 1.1 扩容问题 在项目初期,我们部署了三个数据库A、B、C,此时数据库的规模可以满足我们的业务需求。为了将数据做到平均分配,我们在Service服务层使用uid%3进行取模分片,从而将数据平均分配到三个数据库中。 如…

网络丢包,网络延迟?这款神器帮你搞定所有!

常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Linux 下有一个更好用的网络联通性判断工具,它可以结合ping nslookup traceroute 来判断网络的相关特性,这个命令就是 mtr。 mtr 全称 my tracerout…

2022年“移动云杯”算力网络应用创新大赛圆满落幕,百万大奖揭晓!

11 月 17-18 日,2022 年移动云开发者技术论坛暨“移动云杯”算力网络应用创新大赛总决赛在苏州举行。活动现场公布了 2022 年“移动云杯”算力网络应用创新大赛总决赛获奖名单。同时重磅发布了移动云 openAPI 2.0、首届移动云量子计算大赛。 三大赛道齐发力&#xf…

2022ICPC 网络赛第二场 E An Interesting Sequence

You should generate a sequence of positive integers of length n. Of course,this sequence needs to meet some requirements. ∀ i∈[1,n] ai​>1 ∀ i∈[2,n] gcd(ai−1​,ai​)1 a1​k(k>1) gcd(x,y) means the greatest common divisor of x and y. You n…

启明智显分享|4.3寸智能串口屏应用于充电桩

据数据显示,全球新能源汽车销量正大幅度增长,全球汽车电动化渗透率也由0.8%增长到7.74%,这不仅意味着汽车产业电动化浪潮的来临,也证实了我国新能源汽车行业正处于高速发展状态。随着电动汽车销售量与保有量的迅速增长&#xff0c…

linux线程互斥

文章目录多线程执行的问题Linux线程互斥要解决以上问题&#xff0c;需要做到三点&#xff1a;多线程执行的问题 先看一段代码 int tickets10000;void* buytickets(void* args) {char* name (char*)args;while(1){if(tickets>0){cout<<name<<"] tickets:…

m基于数字锁相环DPLL的分频器simulink仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 随着数字电路技术的发展&#xff0c;数字锁相环在调制解调、频率合成、FM 立体声解码、彩色副载波同步、图象处理等各个方面得到了广泛的应用。数字锁相环不仅吸收了数字电路可靠性高、体…

C++11 互斥锁

目录 互斥锁 2.1 独占互斥量std::mutex std::mutex使用Demo 2.2 递归互斥量std::recursive_mutex 死锁demo 使用std::recursive_mutex递归锁 2.3 带超时的互斥量 std::timed_mutexDemo 2.4 lock_guard和unique_lock的使用和区别 unique_lock,lock_guard的使用 unique…

【数据结构】栈和队列OJ练习

文章目录1. 栈1.1 栈的概念及其结构1.2 栈的实现Stack.hStack.cTest.c2. 队列2.1 队列的概念及其结构2.2 队列的实现Queue.hQueue.cTest.c3. 栈和队列面试题3.1 括号匹配问题3.2 用队列实现栈3.3 用栈实现队列3.4 设计循环队列1. 栈 1.1 栈的概念及其结构 &#x1f436; 栈的…

《深度学习进阶 自然语言处理》第六章:LSTM介绍

文章目录6.1 RNN的问题6.1.1 RNN的复习6.1.2 梯度消失和梯度爆炸6.1.4 梯度爆炸的对策6.2 梯度消失和LSTM6.2.1 LSTM的接口6.2.2 LSTM层的结构6.2.3 输出门6.2.4 遗忘门6.2.5 新的记忆单元6.2.6 输入门6.2.7 LSTM的梯度的流动6.3 使用LSTM的语言模型6.3.1 LSTM层的多层化6.3.2 …