转贴一个别人的代码:package mshtang.ftp;
import java.io.*;
import java.net.*;
import java.util.*;
/**
 * <p>Title: FTPSearch</p>
 * <p>Description: 本类可以搜索某个FTP站点的内容,要求给出站点IP地址。</p>
 * <p>Copyright: 厦门一方软件公司版权所有Copyright (c) 2002</p>
 * <p>Company: 厦门一方软件公司</p>
 * @author 小唐蔡
 * @version 1.0
 */
public class FTPSearch extends Thread
{
  /**主机ip地址*/
  String _host;
  /**端口号*/
  static final int PORT = 21;
  ServerSocket ss;
  Socket _ds;
  Socket _sc;
  PrintStream _out ;
  String _hostAddress;
  BufferedReader _in ;
  BufferedReader _dataIn;
  /**一个临时存放从服务器读取的信息的变量*/
  String _reply;
  /**存放搜索日志*/
  protected StringBuffer _log = new StringBuffer(10000);
  /**存放搜索结果*/
  Vector _result;
  String _user;
  String _pass;
  /**构造函数。<br>参数:ip为远端主机ip地址,user为用户名,pass为口令。*/
  public FTPSearch(String ip,String user,String pass)
  {
    _host = ip;
    _user = user;
    _pass = pass;
    _result = new Vector();
  }  /**构造函数。<br>参数:ip为远端主机ip地址,匿名登录。*/
  public FTPSearch(String ip)
  {
    _host = ip;
    _user = "lq";
    _pass = "linquan";
    _result = new Vector();
  }  /**连接登录<br>Return:<br>true:登录成功;false:登录失败.*/
  protected boolean login()throws UnknownHostException,IOException
  {
    boolean successful = false;
    StringBuffer reply = new StringBuffer();
    _sc = new Socket(_host,PORT);
    _hostAddress = _sc.getLocalAddress().getHostAddress().replace('.',',');
    _sc.setSoTimeout(15000);
    _out = new PrintStream(_sc.getOutputStream(),true);
    _in  = new BufferedReader(new  InputStreamReader(_sc.getInputStream()));
    reply.append(readReply().trim());
    if(reply.toString().startsWith("220"))
    {
      if(comm("USER "+_user))
      {
        if(comm("PASS "+_pass))
        {
          successful = true;
        }
      }
    }
    comm("TYPE A");
    return successful;
  }  /**取得当前所在目录*/
  protected String getCurrentDir()throws IOException
  {
    String currentDir = null;
    if(comm("PWD"))
    {
      StringTokenizer st = new StringTokenizer(_reply);
      st.nextToken();
      StringBuffer rtDir = new StringBuffer(st.nextToken());
      currentDir = rtDir.substring(1,rtDir.length()-1);
    }
    return currentDir;
  }  /**列出站点中所有的目录、子目录和文件,存入_result属性变量,和一个名为“result.txt”的文件。
   *<br>并产生一个名为”Log.txt“日志文件。*/
  public void search()throws IOException,InterruptedException
  {
    try
    {
      for(int i = 0; i < 5; i++)
      {
        if(login())
        {
          break;
        }
        System.out.println("Wait 10 seconds to try again...");
        sleep(10000);
      }
      scan();
      logout();
    }
    catch(IOException ex)
    {    }
    finally
    {
      PrintStream out = new PrintStream(new FileOutputStream("Log.txt"));//会自动创建一个文件
      out.println(_log);
      out.close();
      printResult("result.txt");
    }  }
  protected void scan()throws IOException
  {
    Vector fileNames = new Vector();
    tellPort();
    comm("LIST -R");    //Get data_connection's InputStream.
    try
    {
      _ds = ss.accept();
      System.out.println(ss.toString());
    }
    catch(IOException ex)
    {
      ss.close();
    }
    _dataIn = new BufferedReader(new  InputStreamReader(_ds.getInputStream()));    System.out.println("Scanning now.Please waiting......");
    //Read directory content
    try
    {
      String temp="";
      do
      {
        temp = _dataIn.readLine();
        if(temp == null)
        {
          break;
        }
        fileNames.add(temp);
        //System.out.println(temp);
      }
      while(temp != null);
    }
    catch(InterruptedIOException ex)
    {
      System.out.println("Caught InterruptedIOException1:"+ex);//如果超时则继续
    }    //Read end infomation
    try
    {
      do
      {
        String temp = _in.readLine();
        _log.append(temp + "\r\n");
        System.out.println(temp);
      }
      while(_in.ready());
    }
    catch(InterruptedIOException ex)
    {
      System.out.println("Caught InterruptedIOException2:"+ex);//如果超时则继续
    }
    _result = fileNames;
  }  /**得到搜索结果向量。<br>记住要在执行search()方法后执行。*/
  public Vector getResult()
  {
    return _result;
  }  /**得到搜索日志。<br>记住要在执行search()方法后执行。*/
  public StringBuffer getLog()
  {
    return _log;
  }
public static Vector parse()throws FileNotFoundException,IOException
  {
    Vector  result = new Vector();
    FileInputStream fileIn = new FileInputStream("result.txt");
    BufferedReader fReader = new BufferedReader(new InputStreamReader(fileIn));
    //int size=fileIn.available();
    //System.out.println(String.valueOf(size));
    String dir = "/";
    System.out.println("Parsing now.Please wait......");
    while(fReader.ready())
    {
      String temp = fReader.readLine();
      StringTokenizer tt = new StringTokenizer(temp);      if(tt.countTokens() == 1)
      {
        if(temp.startsWith("/"))
        {
          dir = temp.replace(':',' ').trim() + "/";
        }
        else
        {
          dir = "/"+temp.replace(':',' ').trim() + "/";
        }
        //parseResult.add(dir);
        continue;
      }
      if((!temp.equals("")) && (temp.startsWith("-") || temp.startsWith("b") || temp.startsWith("c") || temp.startsWith("l")))
        //是文件就加上dir加入parseResult.
      {
        for(int i = 0; i < 4; i++)
        {
          tt.nextToken();
        }
        String description="";
        for(int i = 0; i < 4; i++)
        {
          description = description+tt.nextToken()+" ";
        }
        String cont="";
        do
        {
          cont=cont+tt.nextToken()+" ";
        }
        while(tt.hasMoreTokens());
        result.add(new FileInfo(dir+cont.trim(),description.trim()));
        continue;
      }
      else if(temp.startsWith("d"))//是目录
      {
        for(int i=0;i<4;i++)
        {
          tt.nextToken();
        }
        String description="";
        for(int i=0;i<4;i++)
        {
          description=description+tt.nextToken()+" ";
        }
        String cont="";
        do
        {
          cont=cont+tt.nextToken()+" ";
        }
        while(tt.hasMoreTokens());
        result.add(new FileInfo(dir+cont.trim()+"/",description.trim()));
        continue;
      }
      else if(temp.equals(""))
      {
        continue;
      }
    }
    return result;
  }

解决方案 »

  1.   

    protected void logout()throws IOException
      {
        comm("QUIT");
      }  protected void printResult(String resultFile)throws IOException
      {
        PrintStream out=new PrintStream(new FileOutputStream(resultFile));//会自动创建一个文件
        int len=_result.size();
        for (int i=0;i<len;i++)
        {
          out.println(_result.elementAt(i));
        }
        out.close();
      }
      protected boolean comm(String command)throws IOException
      {
        boolean success = false;
        _out.println(command);
        System.out.println("<COMMAND>"+command);
        _log.append("<COMMAND>"+command+"\r\n");
        _reply = readReply();
        if(command.startsWith("USER"))
        {
          success=_reply.startsWith("331")?true:false;
        }
        else if(command.startsWith("PASS"))
        {
          success=_reply.startsWith("230")?true:false;
          try
          {
            readReply();
          }
          catch(InterruptedIOException ex){}
        }
        else if(command.equals("TYPE A"))
        {
          success=_reply.startsWith("200")?true:false;
        }
        else if(command.startsWith("PORT"))
        {
          success=_reply.startsWith("200")?true:false;
        }
        else if(command.startsWith("LIST"))
        {
          success=_reply.startsWith("150")?true:false;
        }
        else if(command.startsWith("NLST"))
        {
          success=_reply.startsWith("150")?true:false;
        }
        else if(command.equals("PWD"))
        {
          success=_reply.startsWith("257")?true:false;
        }
        else if(command.startsWith("STAT"))
        {
          success=_reply.startsWith("211")?true:false;
        }
        else if(command.equals("SYST"))
        {
          success=_reply.startsWith("215")?true:false;
        }
        else if(command.startsWith("SITE"))
        {
          success=_reply.startsWith("214")?true:false;
        }
        else if(command.equals("QUIT"))
        {
          success=_reply.startsWith("221")?true:false;
        }
        return success;
      }
      /**把指定向量中的内容在标准输出打印出来。*/
      public static void printVector(Vector vct)
      {
        int size=vct.size();
        for(int i=0;i<size;i++)
        {
          System.out.println(vct.elementAt(i));
        }
      }
      protected String readReply()throws IOException, InterruptedIOException
      {
        StringBuffer reply=new StringBuffer();
        do
        {
          reply.append(_in.readLine()+"\r\n");
        }
        while(_in.ready());
        System.out.println(reply);
        _log.append(reply);
        _reply=reply.toString();
        return _reply;
      }  private int getDataPort()
      {
        int port=_sc.getLocalPort()+1;
        return port;
      }  private void tellPort()throws IOException
      {
        try
        {
          int port=getDataPort();
          System.out.println("Get data port:"+port);
          int x=(int) Math.round((port/256)-0.5);
          int y=port-x*256;
          try
          {
            ss=new ServerSocket(port);
          }
          catch(IOException ex)
          {
            System.out.println("IOException in Method tellPort() in Class ftpc--"+ex);
          }
          comm("PORT "+_hostAddress+","+x+","+y);
        }
        finally
        {
        }
      }
      public static void main(String arg[])//throws IOException,UnknownHostException,InterruptedException
      {
        try
        {
          FTPSearch client=new FTPSearch("192.168.0.33", "lq", "linquan");
          client.search();
          client.parse();
        }
        catch(Exception ex)//probably catch IOException,UnknownHostException,InterruptedException
        {
          System.out.println(ex);
        }
      }
    }
      

  2.   

    代码中没看见有关解析服务器发回来的List列表的内容。
      

  3.   

    楼上的说得有道理,每个字段的长度在每一行都是一样的的。
    这就好办了,截取这么长一个字段,然后去除首尾空格……YEAH!
      

  4.   

    static String[] analyseList(String _strLine)
    {
    String[] strReturn = new String[4];

    strReturn[0] = _strLine.substring(0,1); //文件夹与否的标识
    strReturn[1] = Utils.trimBlanks(_strLine.substring(55));//文件名
    strReturn[2] = Utils.trimBlanks(_strLine.substring(29,41));//文件大小
    strReturn[3] = Utils.trimBlanks(_strLine.substring(42,54));//修改日期

    return strReturn;
    }