2013-12-20 3 views
2

Я разработал проект, который использует класс sun.net.ftp.FtpClient для загрузки файла с ftp-сервера, пока я использовал JDK 1.5. Теперь я переключился на JDK 1.7 и получил следующую ошибку.Получение ошибки с sun.net.ftp.FtpClient с помощью JDK 1.7

java: sun.net.ftp.FtpClient is abstract; cannot be instantiated 

швы мне JDK 1.7 не поддерживает FtpClient.

Любые предложения по решению этой проблемы приветствуются?

ответ

5

Вы не должны использовать классы в sun.* - нет гарантии, что они останутся совместимыми с java-версиями.

Я бы предложил переписать вместо этого что-то вроде Apache Commons FTP. Он должен быть довольно прост в использовании, поэтому это должна быть легкая работа.

2

Несмотря на то, что в этом классе есть истина в sun.*, ответ не учитывает ошибку, а также предлагает альтернативу.

У меня нет области видимости контекста, в котором вы пытаетесь создать экземпляр sun.net.ftp.FtpClient, но это все еще возможно.

Класс является абстрактным, поэтому его невозможно создать. (См. §8.1.1.1)

Все не потеряно. Чтобы получить экземпляр FtpClient, вы можете использовать статические методы из sun.net.ftp.FtpClientProvider, который находится в SDK, чтобы сделать так, как в примере ниже:

... 
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()); 
... 

Существует немного больше работы, связанной, но это позволяет вы не должны добавлять новую библиотеку с кучами классов, которые вам не нужны, - это зависит от того, что вы хотите сделать.

3

Есть некоторые изменения с 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();