commons-net3.0是apache公司的开源jar包, 我使用它来对一台linux中文操作系统电脑进行ftp连接, 几经修改后, 总结如下:
1. 操作系统的配置
在ftpClient.login(..)成功后, 调用
ftpClient.configure(new FTPClientConfig(ftpClient.getSystemType()));
2.中文乱码问题的解决
ftpClient = new FTPClient();
ftpClient.setControlEncoding("GBK");
3.FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里,什么反应都没有,出现假死状态的解决
在执行FTPClient.listFiles()或者FTPClient.retrieveFile()方法前调用ftpClient.enterLocalPassiveMode();
这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据.为什么要这样做呢, ftp server可能每次开启不同的端口来传输数据,但是在linux上, 安全限制,可能某些端口没有开启, 就出现阻塞.原文链接http://lgclf.blog.163.com/blog/static/384452222011913114428161/
4.listFiles()返回为空的解决
一般是 ftp服务器(主要是小型机)的操作系统不同语言环境的时间格式造成的,在中文环境下,文件或文件夹的时间格式为"m月d日 hh:mm"或"yyyy年m月 d",而E文环境下时间格式为"MMM d yyyy"或"MMM d HH:mm",于是,在中文环境下,ftp包中的FTPTimestampParserImpl类将时间字符串Date化时抛异常, commons-net包不支持中文.
解决办法(两种办法):
1. 将ftp服务器操作系统语言环境设为英文;
2. 修改ftp包的代码:将FTPTimestampParserImpl类进行扩展,使之支持中文
下面针对第2种解决办法来实现:
(1) 新建类FTPTimestampParserImplExZH类:
/**
* FTPTimestampParserImpl的扩展类,使之支持中文环境的时间格式
* Date:2007-8-15
*/
package org.apache.commons.net.ftp.parser;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* @author hzwei206
* FTPTimestampParserImpl的扩展类,使之支持中文环境的时间格式
*/
public class FTPTimestampParserImplExZH extends FTPTimestampParserImpl
{
private SimpleDateFormat defaultDateFormat = new SimpleDateFormat("mm d hh:mm");
private SimpleDateFormat recentDateFormat = new SimpleDateFormat("yyyy mm d");
/**
* @author hzwei206
* 将中文环境的时间格式进行转换
*/
private String formatDate_Zh2En(String timeStrZh)
{
if (timeStrZh == null)
{
return "";
}
int len = timeStrZh.length();
StringBuffer sb = new StringBuffer(len);
char ch = '' '';
for (int i = 0;i < len;i )
{
ch = timeStrZh.charAt(i);
if ((ch >= ''0'' && ch <= ''9'') || ch == '' '' || ch == '':'')
{
sb.append(ch);
}
}
return sb.toString();
}
/**
* Implements the one {@link FTPTimestampParser#parseTimestamp(String) method}
* in the {@link FTPTimestampParser FTPTimestampParser} interface
* according to this algorithm:
*
|