我开发了一个使用sun.net.ftp.FtpClient类从使用JDK1.5的ftp服务器下载文件的项目。现在,我切换到JDK1.7,并得到以下错误。
java: sun.net.ftp.FtpClient is abstract; cannot be instantiated它接踵而至,JDK1.7不支持FtpClient。
有什么解决这个问题的建议是欢迎的吗?
发布于 2013-12-20 09:23:23
您不应该在sun.*中使用类--不能保证它们在java版本之间保持兼容。
我建议重写一下,使用类似于Apache Commons FTP的东西。它应该是相当简单的使用,所以它应该是一个容易的工作。
发布于 2015-02-13 08:46:25
尽管应该避免使用sun.*中的类,但除了建议另一种方法之外,答案并不能恰当地解决错误。
在您试图实例化sun.net.ftp.FtpClient的上下文中,我没有一个范围--但是仍然可以这样做。
这个类是抽象的,所以不能实例化它。(见§8.1.1.1)
不过,并不是所有的东西都丢失了。要获得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());
...还有更多的工作要做,但它允许您避免添加包含大量不需要的类的新库--这取决于您想要做什么。
发布于 2015-03-20 01:45:17
自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();https://stackoverflow.com/questions/20699367
复制相似问题