使用commons-net-2.0.jar包进行FTP操作

使用FTPClient下载文件时,如果路径中有中文无法下载,将路径
转码为iso-8859-1后,可以下载

还有一种方式,再new FTPClient() 后,可以设置编码,

ftpClient = new FTPClient();
ftpClient.setControlEncoding(GBK); //不能在connect,login之后设置
ftpClient.connect(ip, port);
ftpClient.login(userName, passWord);

但一定要在创建时设置,不能在连接、登录后再设置,否则不生效

查看源码得知
FTPClient 继承FTP,FTP 继承 SocketClient,
所以ftpClient调用方法connect()时,会调用_connectAction_()方法,如果还没有没置编码,
getControlEncoding()会默认使用ios-8859-1,
所以必需在connect前完成编码设置

FTP在_connectAction_()方法时使用设置的编码

  protected void _connectAction_()
    throws IOException
  {
    super._connectAction_();
    this._controlInput_ = new BufferedReader(new InputStreamReader(this._socket_.getInputStream(), getControlEncoding()));

    this._controlOutput_ = new BufferedWriter(new OutputStreamWriter(this._socket_.getOutputStream(), getControlEncoding()));

    __getReply();

    if (FTPReply.isPositivePreliminary(this._replyCode))
      __getReply();
  }


FTP 继承 SocketClient,connect()时调用_connectAction_()
  public void connect(InetAddress host, int port)
    throws SocketException, IOException
  {
    this._socket_ = this._socketFactory_.createSocket();
    this._socket_.connect(new InetSocketAddress(host, port), this.connectTimeout);

    _connectAction_();
  }