使用JDK 1.7获取sun.net.ftp.FtpClient的错误

使用JDK 1.7获取sun.net.ftp.FtpClient的错误,ftp,java-7,ftp-client,sun,Ftp,Java 7,Ftp Client,Sun,我开发了一个项目,使用sun.net.ftp.FtpClient类从ftp服务器下载一个文件,当时我正在使用JDK1.5。 现在我已经切换到JDK1.7,我得到以下错误 java: sun.net.ftp.FtpClient is abstract; cannot be instantiated 对我来说,JDK 1.7不支持FtpClient 欢迎提出任何解决此问题的建议 您不应该在sun.*中使用类-不能保证它们在java版本之间保持兼容 我建议重写,改为使用类似的内容。它应该非常简单易用

我开发了一个项目,使用
sun.net.ftp.FtpClient
类从ftp服务器下载一个文件,当时我正在使用JDK1.5。 现在我已经切换到JDK1.7,我得到以下错误

java: sun.net.ftp.FtpClient is abstract; cannot be instantiated
对我来说,JDK 1.7不支持FtpClient


欢迎提出任何解决此问题的建议

您不应该在
sun.*
中使用类-不能保证它们在java版本之间保持兼容


我建议重写,改为使用类似的内容。它应该非常简单易用,因此应该是一项容易的工作。

即使应该避免使用
sun中的类。*
中的类也是正确的,但答案除了建议一种替代方法外,并没有适当地解决错误

我在您试图实例化
sun.net.ftp.FtpClient
的上下文中没有作用域,但仍然可以这样做

该类是抽象的,因此不能实例化它。(见附件)

不过,一切都没有失去。 要获取
FtpClient
的实例,您可以使用SDK中的
sun.net.ftp.FtpClientProvider
中的静态方法来执行此操作,如下例所示:

...
final FtpClient ftpClient = FtpClientProvider.provider().createFtpClient();
final InetAddress inetAddress = InetAddress.getByName(ftpUrl.getHost());
final int port = ftpUrl.getPort();
final InetSocketAddress socketAddress = new InetSocketAddress(inetAddress, port);
ftpClient.connect(socketAddress);
ftpClient.login(username, password.toCharArray());
...

这需要做更多的工作,但它允许您避免添加包含大量不需要的类的新库—这取决于您想做什么。

自1.7版以来,有一些更改。 例如:

 * before 1.7
 * FtpClient fc=new FtpClient(url,port);
 * fc.login(user, pwd);
 *  fc.binary();
 *  fc.put(remotefilename);
 *  fc.closeServer();
 *  
 * since 1.7
 * FtpClient fc = FtpClient.create(url)
 * fc.login(user, null, pwd);
 * fc.setBinaryType();
 * fc.put(remotefilename,true);
 * fc.close();