FTPClient.changeWorkingDirectory()无法进入中文目录

来源:互联网 发布:沉迷网络 大学生 事例 编辑:程序博客网 时间:2024/06/08 15:29

问题描述:如题

lib库:apache commons-net库,ftp应用

常见场景:递归遍历ftp服务器文件列表,切换工作路径(即ftp中的cd命令)

问题表现:能够正常进入纯英文路径;无法进入中文目录

原因分析:查看commons-net源码。

方法定义:

@return

    public boolean changeWorkingDirectory(String pathname) throws IOException
    {
        return FTPReply.isPositiveCompletion(cwd(pathname));
    }

1,返回boolean类型,暗示这个操作是可能失败,失败后工作路径不改变。而一般我们使用这个lib方法时,都不做成功判断。

2,实际调用FTPClient.cwd(String path)方法

问题本质:

1,从英文无问题,中文有问题,说明是命令的编码导致,即我们送中文路径的ftp命令编码是错误的,真正正确的编码应该是服务器端的编码

2,查看源码可知,查找我们送的编码和实际正确的编码:调用changeWorkingDirectory()方法使用的编码为FTPClient.setControlEncoding()所设置的编码,而系统默认为

  public static final String DEFAULT_CONTROL_ENCODING = "ISO-8859-1";

3,如果没有显示调用setControlEncoding方法,则使用默认系统编码,而默认编码是不会有问题的

4,为了获取不会乱码的中文路径名,调用setControlEncoding("GBK");改变了编码,导致问题

解决方法:

改变调用pathname的编码

changeWorkingDirectory(new String(pathname.getBytes(),FTP.DEFAULT_CONTROL_ENCODING));

 

原创粉丝点击