在使用ftpClient 作为下载工具类的时候可能出现的问题:
FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"), "iso-8859-1"));
在这个地方可能会抛出 Unknown parser type:xxx异常;
问题:在FTPClient 类中:listFiles的执行过程如下:
listFiels()--->initiateListParsing(String parserKey, String pathname)---->__parserFactory.createFileEntryParser(parserKey);
其中__parserFactory:FTPFileEntryParserFactory __parserFactory;
重点就是FTPFileEntryParserFactory 这个类:
这个类的createFileEntryParser方法里面规定解析的key(也就是系统的类别);
默认下是有UNIX,window等;
但是可能情况下你访问的ftpserver放回的key都不在这里面;
现在你需要做的就是另写一个类;继承DefaultFTPFileEntryParserFactory;
这这个方法里面添加你需要解析的类
@Override public FTPFileEntryParser createFileEntryParser(String key) { if (key == null) { throw new ParserInitializationException("Parser key cannot be null"); } Class parserClass = null; FTPFileEntryParser parser = null; try { parserClass = Class.forName(key); parser = (FTPFileEntryParser)parserClass.newInstance(); } catch (ClassNotFoundException e) { try { String ukey = null; if (null != key) { ukey = key.toUpperCase(Locale.ENGLISH); } System.out.println("--------------------the ukey is :"+ukey); if ((ukey.indexOf("UNIX") >= 0) || (ukey.indexOf("TYPE: L8") >= 0)) { System.out.println("the ukey is :"+ukey); parser = createUnixFTPEntryParser(); } else if (ukey.indexOf("VMS") >= 0) { parser = createVMSVersioningFTPEntryParser(); } else if (ukey.indexOf("WINDOWS") >= 0 || ukey.indexOf("MSDOS") >= 0||(ukey.indexOf("FTP SERVER, HUAWEI CO")>=0)) { //妈的,非得逼我这么干 parser = createNTFTPEntryParser(); } else if (ukey.indexOf("OS/2") >= 0) { parser = createOS2FTPEntryParser(); } else if ((ukey.indexOf("OS/400") >= 0) || (ukey.indexOf("AS/400") >= 0)) { parser = createOS400FTPEntryParser(); } else if (ukey.indexOf("MVS") >= 0) { parser = createMVSEntryParser(); } else if (ukey.indexOf("NETWARE") >= 0) { parser = createNetwareFTPEntryParser(); } else { throw new ParserInitializationException("Unknown parser type: " + key); } } catch (NoClassDefFoundError nf) { throw new ParserInitializationException("Error initializing parser", nf); } } catch (NoClassDefFoundError e) { throw new ParserInitializationException("Error initializing parser", e); } catch (ClassCastException e) { throw new ParserInitializationException(parserClass.getName() + " does not implement the interface " + "org.apache.commons.net.ftp.FTPFileEntryParser.", e); } catch (Throwable e) { throw new ParserInitializationException("Error initializing parser", e); } return parser; }
这样问题就over