一直想写一个从客户端连接至FTP服务器下载某文件的程序.现在输出文件内容可以了,但是实现下载...受困了:(
    我的思路是将该FTP上欲下载的文件长度读出,再写到本地磁盘.
import java.net.*;
import java.io.*;
class ftp_ex{
public static void main(String[] args){
   try{
   byte[] data=new byte[1024];
URL url=new URL("ftp://aaa:[email protected]/a/b.txt");
InputStream urlc=url.openStream();
URLConnection uc=url.openConnection();
int contentLength=uc.getContentLength();
System.out.println("contentLength="+contentLength);
String filename=url.getFile();
filename=filename.substring(filename.lastIndexOf('/'));
System.out.println("文件名="+filename);
FileOutputStream fout=new FileOutputStream(filename);
          
fout.write(data);
fout.flush();
fout.close();

urlc.close();
}
catch(Exception e){
System.err.println("err!");
}
}
}
   本想采用这种类似从网页上下载文件的方法来获取FTP文件的长度的方法,但这里contentLength的值输出却为-1,导致后面的write(data)不知道该怎么来实现了:(
   两点请求帮助:1是如何获取FTP文件的长度?2是如果我的思路有错,应采用何种思路来正确获取FTP服务器上的某文件?

解决方案 »

  1.   

    我都是拿cmd命令行的方式做的,比如
    D:\Documents and Settings>ftp
    ftp> open 192.168.1.122
    Connected to 192.168.1.122.
    220 thserveradmin Microsoft FTP Service (Version 5.0).
    User (192.168.1.122:(none)): administrator
    331 Password required for administrator.
    Password:
    230 User administrator logged in.
    ftp> ls
    200 PORT command successful.
    150 Opening ASCII mode data connection for file list.
    bea8
    complet.rar
    epson
    226 Transfer complete.
    ftp: 收到 671 字节,用时 0.07Seconds 9.59Kbytes/sec.
    ftp> get complet.rar
    200 PORT command successful.
    150 Opening ASCII mode data connection for complet.rar(37991 bytes).
    226 Transfer complete.
    ftp: 收到 37991 字节,用时 0.04Seconds 949.77Kbytes/sec.
    ftp> bye
    221你就模拟命令行就完事了
    D:\Documents and Settings>
      

  2.   

    这种东西有现成的jar可用,没必要自己开发了http://www.enterprisedt.com/products/edtftpj/overview.html
      

  3.   

    我得做法和你差不多,一般contentLength的值输出为-1有两种可能,一是文件不存在 ,二是文件太大,超过int型上限 ,好像是 2的21还是22次方,基础不扎实记不住了
      

  4.   

    应该不是因为文件太大,我只是用一个文本文件在做测试或者换一个不大的binary文件.我想,是不是路径或权限的原因?但是通过这种方式得到的stream却可以通过readln来打印,但是为什么不能保存呢?这使我困惑,同样的方法用在http://x.x.x.x/a/b.txt下载却是没有问题的.
        谢谢hellwindy的思路及sunggwei(sun)提供的下载地址:)
      

  5.   

    最后是使用import sun.net.*及import sun.net.ftp.*来实现的:)完整代码如下:
    import java.io.*;
    import sun.net.*;
    import sun.net.ftp.*;
    class ftp_ex4{
    public static void main(String[] args){
    String server="192.168.1.27";
    String user="aaa";
    String password="aaa123";
    String path="/a";
    String filename="ex1.txt";
    try{
    FtpClient ftpClient=new FtpClient();
    ftpClient.openServer(server);
    ftpClient.login(user,password);
    System.out.println("path.length="+path.length());
    if(path.length()!=0)
    ftpClient.cd(path);
    ftpClient.binary();
    TelnetInputStream is=ftpClient.get(filename);
    File file_out=new File(filename);
    FileOutputStream os=new FileOutputStream(file_out);
    byte[] bytes=new byte[1024];
    int c;
    while((c=is.read(bytes))!=-1){
    os.write(bytes,0,c);
    }
    is.close();
    os.close();
    ftpClient.closeServer();
    }
    catch(IOException e){
    System.err.println("err");
    }
    }
    }
      

  6.   

    楼上的 没有读出FTP服务器文件的长度
      

  7.   

    是的,这里不需要读出文件总长度.用
    while((c=is.read(bytes))!=-1){
      os.write(bytes,0,c);
    }
    来实现.