在Java中实现FTP的问题

在Java中实现FTP怎么用模糊文件名进行搜索文件名。如:20090819、20090820我想搜索下载含有200908的文件。

用JAVA获取FTP文件列表

public class FtpClientUtil {
FtpClient ftpClient;
private String server;
private int port;
private String userName;
private String userPassword;

public FtpClientUtil(String server,int port,String userName,String userPassword)
{
this.server=server;
this.port=port;
this.userName=userName;
this.userPassword=userPassword;
}
/**

  • 链接到服务器
  • @return
    */
    public boolean open()
    {
    if(ftpClient!=null&&ftpClient.serverIsOpen())
    return true;
    try
    {
    ftpClient= new FtpClient();
    ftpClient.openServer(server,port);
    ftpClient.login(userName, userPassword);
    ftpClient.binary();
    return true;
    }
    catch(Exception e)
    {
    e.printStackTrace();
    ftpClient=null;
    return false;
    }
    }

    public boolean cd(String dir){
    boolean f = false;
    try {
    ftpClient.cd(dir);
    } catch (IOException e) {
    Logs.error(e.toString());
    return f;
    }
    return true;
    }

    /**

  • 上传文件到FTP服务器

  • @param localPathAndFileName 本地文件目录和文件名

  • @param ftpFileName 上传后的文件名

  • @param ftpDirectory FTP目录如:/path1/pathb2/,如果目录不存在回自动创建目录

  • @throws Exception
    */
    public boolean upload(String localDirectoryAndFileName,String ftpFileName,String ftpDirectory)throws Exception {
    if(!open())
    return false;
    FileInputStream is=null;
    TelnetOutputStream os=null;
    try
    {
    char ch = ' ';
    if (ftpDirectory.length() > 0)
    ch = ftpDirectory.charAt(ftpDirectory.length() - 1);
    for (; ch == '/' || ch == '\'; ch = ftpDirectory.charAt(ftpDirectory.length() - 1))
    ftpDirectory = ftpDirectory.substring(0, ftpDirectory.length() - 1);

    int slashIndex = ftpDirectory.indexOf(47);
    int backslashIndex = ftpDirectory.indexOf(92);
    int index = slashIndex;
    String dirall = ftpDirectory;
    if (backslashIndex != -1 && (index == -1 || index > backslashIndex))
    index = backslashIndex;
    String directory = "";
    while (index != -1) {
    if (index > 0) {
    String dir = dirall.substring(0, index);
    directory = directory + "/" + dir;
    ftpClient.sendServer("XMKD " + directory + "\r\n");
    ftpClient.readServerResponse();
    }
    dirall = dirall.substring(index + 1);
    slashIndex = dirall.indexOf(47);
    backslashIndex = dirall.indexOf(92);
    index = slashIndex;
    if (backslashIndex != -1 && (index == -1 || index > backslashIndex))
    index = backslashIndex;
    }
    ftpClient.sendServer("XMKD " + ftpDirectory + "\r\n");
    ftpClient.readServerResponse();

    os = ftpClient.put(ftpDirectory + "/"

    • ftpFileName); File file_in = new File(localDirectoryAndFileName); is = new FileInputStream(file_in); byte bytes[] = new byte[1024]; int i; while ((i = is.read(bytes)) != -1) os.write(bytes, 0, i); //清理垃圾

    return true;
    }
    catch(Exception e)
    {
    e.printStackTrace();
    return false;
    }
    finally
    {
    if (is != null)
    is.close();
    if (os != null)
    os.close();
    }
    }
    /**

  • 从FTP服务器上下载文件并返回下载文件长度

  • @param ftpDirectoryAndFileName

  • @param localDirectoryAndFileName

  • @return

  • @throws Exception
    */
    public long download(String ftpDirectoryAndFileName,String localDirectoryAndFileName)throws Exception
    {
    long result = 0;
    if(!open())
    return result;
    TelnetInputStream is = null;
    FileOutputStream os = null;
    try

    {
    is = ftpClient.get(ftpDirectoryAndFileName);

    java.io.File outfile = new java.io.File(localDirectoryAndFileName);
    os = new FileOutputStream(outfile);
    byte[] bytes = new byte[1024];
    int c;
    while ((c = is.read(bytes)) != -1)
    {
    os.write(bytes, 0, c);
    result = result + c;
    }
    }
    catch (Exception e)

    {
    throw e;
    }
    finally
    {
    if (is != null)
    is.close();
    if (os != null)
    os.close();

    }
    return result;
    }
    [color=red] /**

  • 返回FTP目录下的文件列表

  • @param ftpDirectory

  • @return
    /
    public List getFileNameList(String ftpDirectory)
    { [/color]
    List list = new ArrayList();
    if(!open())
    return list;
    try

    {
    DataInputStream dis = new DataInputStream(ftpClient.nameList(ftpDirectory));
    String filename = "";
    while((filename=dis.readLine())!=null)

    {
    list.add(filename);

    }

    } catch (Exception e)

    {
    e.printStackTrace();
    }
    return list;
    }
    /
    *

    • 删除FTP上的文件
    • @param ftpDirAndFileName / public boolean deleteFile(String ftpDirAndFileName) { if(!open()) return false; ftpClient.sendServer("DELE "+ftpDirAndFileName+"\r\n"); return true; } /*
    • 删除FTP目录
    • @param ftpDirectory / public boolean deleteDirectory(String ftpDirectory) { if(!open()) return false; ftpClient.sendServer("XRMD "+ftpDirectory+"\r\n"); return true; } /*
    • 关闭链接 */ public void close() { try { if(ftpClient!=null&&ftpClient.serverIsOpen()) ftpClient.closeServer(); }catch(Exception e) {

    }
    }
    }

对所有的文件名进行配置,符合条件的下载,匹配方法:

[code="java"]filename.contains("200908");[/code]

代码1

[code="java"] //当前目录的file实例

File parentDir=new File(absoluteDir);

//列举当前目录下的所有文件名字

String []list=parentDir.list(); [/code]

[color=darkred]使用上面的list在下面程序中过滤不符合要求的文件[/color]

代码2:
[code="java"]
//保留指定的格式名字的文件
public static List filteFiles(List list,String allowedName){
Iterator it=list.iterator();

    while(it.hasNext()){ 

        String s=it.next(); 

        //如果和所有的扩展名都不匹配,则从list中移除 
        if(s.contains("200908")){ 
            it.remove(); 
        } 
    } 
    return list; 
} [/code]

实现模糊搜索。

[b]你是使用Java直接来做FTP客户端?

如果这样的话,你就很象是在 HTTP的协议下,开发浏览器 。

首先,你必须对FTP下的底层通信很了解。

其次,要实现模糊搜索下载,你要利用组合使用以下FTP命令如下[/b]:

(更多命令,参见FTP协议)

[b][quote]
LIST (查看当前目录下的列表)

RETR (从FTP服务器下载指定的文件)
[/quote][/b]
[color=blue][b]
至于你的模糊搜索下载,可以通过以下方式实现:

1、获得当前的目录下的所有文件名(向FTP服务发送list命令):
[quote] [b][/b][/quote]

2、然后(在本地)用正则表达式(或其他方法)获得匹配的所有文件名(保存在List中)。

这样应该是难点所在,分解FTP服务器返回的数据,然后匹配,最后得到要下载的文件列表

3、依次向FTP服务器发送 RETR filename的指令,去取想下载的文件。[/b][/color]

[b]不好意思。刚才写错了,查看文件夹的命令是:

[quote]NLST [/quote]
[/b]