关于java 下载文件出现的问题:ParserInitializationException: Unknown parser type:xxx

在使用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;
	}

在你的设置你的ftpclient的解析实现类:ftpClient.setParserFactory(new OSSFTPFileEntryParserFactory());

这样问题就over 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值