ftp 不要用 sun ftpclient

2024-05-13 14:32
文章标签 sun ftp 不要 ftpclient

本文主要是介绍ftp 不要用 sun ftpclient,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在开发一个web应用过程中,需要开发一个服务使用ftp功能将数据传输一个网外的ftp服务器。最初使用sun.net.ftp.ftpClient类,但是遇到问题,在网内测试没有问题,向网外传时报告失败。开发环境如下: 
web服务:tomcat 5.5.28 
OS平台:Linux 5 
java: 1.5 
失败报告:port命令失败,试试用pasv代替。代码如下: 
Java代码   收藏代码
  1. TelnetOutputStream os = null;  
  2.         FileInputStream in =null;             
  3.         try {  
  4.             logger.debug("开始上传文件"+sourceFile);  
  5.             java.io.File file_in = new java.io.File(sourceFile);  
  6.             in = new FileInputStream(file_in);  
  7.             //ftpClient.sendServer("TYPE I \r\n");  
  8.             //ftpClient.sendServer("PASV \r\n" );  
  9.             //logger.debug("发送TYPE I 和 PASC命令");  
  10.             // 命名文件,将文件名编码转为utf-8,否则中文文件名上载后为乱码文件名            
  11.             //os = ftpClient.put(new String(targetFile.getBytes("UTF-8")));  
  12.             os = ftpClient.put(targetFile);  
  13.             logger.debug("创建"+targetFile+" 成功");  
  14.             byte[] bytes = new byte[4096];  
  15.             int c;  
  16.             while ((c = in.read(bytes)) != -1) {  
  17.                 os.write(bytes, 0, c);  
  18.             }  
  19.         } catch (IOException e) {  
  20.             logger.error(e.getMessage());  
  21.             return 0;  
  22.         } finally {  
  23.             if (in != null) {  
  24.                 in.close();  
  25.             }  
  26.             if (os != null) {  
  27.                 os.close();  
  28.             }  
  29.             }  

代码在os = ftpClient.put(targetFile)这句出错,这样的代码在网上都很常见,但大约可以肯定的是许多的人只是拷贝复制下来构造一篇博文,并没有真正实践过。 
  试着给服务器发送PASV命令也不行。查看ftpClient的源代码,发现ftpClient在上载数据前首先尝试PASV模式,如PASV模式失败再使用PORT模式。通过TelnetOutputStream os = null此句代码,推测是否使用了telent功能,调整两边的路由器防火墙功能,折腾半死,程序失败依旧。 
  鉴于源代码使用telnetoutputStream,又没有控制传输模式的方法和命令,最后只好弃用sun.net.ftp.ftpClient,使用org.apache.commons.net.ftp.FTPClient类开发调试成功。部分代码如下: 
Java代码   收藏代码
  1. public boolean uploadFile(String fileName, String newName)  
  2.         throws IOException {  
  3.     boolean flag = false;  
  4.     InputStream iStream = null;  
  5.     try {  
  6.         iStream = new FileInputStream(fileName);  
  7.         ftpClient.enterLocalPassiveMode();  
  8.         logger.debug("Set pasv return code:"+ftpClient.getReplyCode());  
  9.         flag = ftpClient.storeFile(newName, iStream);  
  10.         logger.debug("upload file return code:"+ftpClient.getReplyCode());  
  11.     } catch (IOException e) {  
  12.         logger.debug("upload error:"+ftpClient.getReplyCode());  
  13.         flag = false;  
  14.         return flag;  
  15.     } finally {  
  16.         if (iStream != null) {  
  17.             iStream.close();  
  18.         }  
  19.     }  
  20.     return flag;  
  21. }  

  最后,找到java的老巢去,发现在java 1.5的文档里,有这样一段话: 

Why Developers Should Not Write Programs 
That Call 'sun' Packages 
The classes that Sun includes with the Java 2 SDK, Standard Edition, fall into package groups java.*, javax.*, org.* and sun.*. All but the sun.* packages are a standard part of the Java platform and will be supported into the future. In general, packages such as sun.*, that are outside of the Java platform, can be different across OS platforms (Solaris, Windows, Linux, Macintosh, etc.) and can change at any time without notice with SDK versions (1.2, 1.2.1, 1.2.3, etc). Programs that contain direct calls to the sun.* packages are not 100% Pure Java. In other words: 

    The java.*, javax.* and org.* packages documented in the Java 2 Platform Standard Edition API Specification make up the official, supported, public interface. 
    If a Java program directly calls only API in these packages, it will operate on all Java-compatible platforms, regardless of the underlying OS platform. 

    The sun.* packages are not part of the supported, public interface. 
    A Java program that directly calls into sun.* packages is not guaranteed to work on all Java-compatible platforms. In fact, such a program is not guaranteed to work even in future versions on the same platform. 

For these reasons, there is no documentation available for the sun.* classes. Platform-independence is one of the great advantages of developing in the Java programming language. Furthermore, Sun and our licensees of Java technology are committed to maintaining backward compatibility of the APIs for future versions of the Java platform. (Except for code that relies on serious bugs that we later fix.) This means that once your program is written, the class files will work in future releases. 
  具体URL: http://java.sun.com/products/jdk/faq/faq-sun-packages.html  
  真是为在sun.net.ftp上浪费掉的时间懊恼不已。 
  留文于此,希望广大朋友们在开发过程中少走弯路。 
  PS到处拷贝粘帖赚文章的“专业技术作家”!

这篇关于ftp 不要用 sun ftpclient的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985967

相关文章

如何导入sun.misc.BASE64Encoder和sum.misc.BASE64Decoder

右击项目名--->Build Path--->Configure Build Path...--->java Build Path--->Access rules:1 rule defined,added to all librar...   --->Edit --->Add...

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用,模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇,同时也伴随着一系列需要克服的挑战,如何看待企业引进增材制造,小编为您全面分析。 机遇篇: 加速产品创新:3D打印技术如同一把钥匙,为模具企业解锁了快速迭代产品设计的可能。企业能够迅速将创意转化为实体模型,缩短产品从设计到市场的周期,抢占市场先机。 强化定制化服务:面

Ubuntu ftp搭建--配置不同用户不同权限

一、安装VSFTP sudo apt-get install vsftpd 二、添加FTP用户 sudo mkdir /etc/vsftpdsudo useradd -m -d /home/vsftpd vsftpd --用户名为vsftpd,目录和用户名可以自己更改sudo vi /etc/vsftpd/ftpuser.txt --这个到时与vsftp的配置文件对应建立一

【虚拟机/服务器】Ubuntu Server上配置FTP服务器

当使用FTP工具连接但 Ubuntu Server 未安装 vsftpd 时会出现这样的报错 安装vsftpd sudo apt-get install vsftpd 卸载vsftpd sudo apt-get remove --purge vsftpd 当 Ubuntu Server 未启动 vsftpd 时会出现这样的报错 启动vsftpd sudo service

大家不要退小黄车的押金了

大家好,首先我不是ofo的任何人,我只是一名小黄车的使用者,从去年开始就一直关注这ofo、摩拜的信息,最近这段时间ofo陷入了囧境,大家都担心自己的押金,全都去退还押金,这样无疑是给ofo有一层打击,因为本来资金已经很紧张了,ofo的用户也不在少数,没有资本的涌入,它也挺可怜的,它去哪里给你们退钱呢。           ofo的诞生,给我们提供了方便我们是毋庸置疑的,不光是

社交平台找旅游搭子一起旅行靠谱吗?答案是不要太爽!

哈喽小伙伴们,今天要跟大家分享一个超级棒的小程序——咕哇找搭子!作为一个热爱自由行的人,最头疼的就是找不到志同道合的小伙伴。但自从用了这个咕哇小程序后,一切都变得简单又充满乐趣啦!🎉 上个月,我计划去云南旅行,就试着在咕哇上发布了我的行程信息。没想到很快就收到了几位朋友的回应,其中一位叫小莲的朋友特别投缘。我们不仅目的地一样,就连兴趣爱好都出奇地相似,于是我们就决定一起出发啦!👭

【上】java获取requestMapping上所有注解功能实现及取匿名注释类的值及 class com.sun.proxy.$Proxy140 转换出错

java获取requestMapping上所有注解功能实现及取匿名注释类的值及 class com.sun.proxy.$Proxy140 转换出错 1,多人相当然以为类似对象一样直接强转下就可以,结果迎来的是class com.sun.proxy.$Proxy140转换出错【想法很勇敢,现实很骨感】 //Class<A> operatorMappingAnnotationType// 错误

【spring】does not have member field ‘com.sun.tools.javac.tree.JCTree qualid

spring-in-action-6-samples 的JDK版本 最小是11,我使用 了22: jdk21 jdk22 都与lombok 不兼容,必须使用兼容版本, 否则报错: thingsboard 的大神解释了: java: java.lang.NoSuchFieldError: Class com

Centos7下,Vsftpd工具,搭建ftp服务器

Centos7安装Vsftpd工具 1.下载与安装 1.1 安装环境 测试系统:Centos7.0 所用软件:vsftpd-3.0.2-21.e17.x86_64 下载地址: http://mirror.centos.org/centos/7/os/x86_64/Packages/vsftpd-3.0.2-21.el7.x86_64.rpm 1.2 开始安装 1.2.1 查询是否系统

【深度分析】报错:com.sun.org.apache.regexp.internal does not exist

文章目录 问题分析思路这个类在哪里?本地能跑,Jenkins 上不能跑?JDK 把这个 package 删掉了?JDK 啥时候把 package 删掉了?翻阅 JDK8 Release Notes查阅 Jakarta-regexp查阅 bug 说明 解决参考 问题 项目本地 mvn clean install 打包都正常,但是到 jenkins 中打包就会报错。 报错信息