В случае создания экземпляра экземпляр нестационарного внутреннего класса создается с ссылкой на объект внешнего класса, в котором он определен. Это означает, что у него есть инклюзивный экземпляр. Но экземпляр статического внутреннего класса создается со ссылкой на класс Outer, а не ссылкой на объект внешнего класса. Это означает, что он не включает экземпляр.
Например:
class A
{
class B
{
// static int x; not allowed here…..
}
static class C
{
static int x; // allowed here
}
}
class Test
{
public static void main(String… str)
{
A o=new A();
A.B obj1 =o.new B();//need of inclosing instance
A.C obj2 =new A.C();
// not need of reference of object of outer class….
}
}
Другая опция состоит в том, чтобы рассмотреть рассмотрение библиотека JSch . JSch, кажется, предпочтительная библиотека для нескольких больших проектов с открытым исходным кодом, включая Eclipse, Муравья и Apache палата общин HttpClient, среди других.
Это поддерживает и пользователя/передачу и основанные на сертификате логины приятно, а также весь большое количество других вкусных функций SSH2.
Вот простой удаленный файл, получают по SFTP. Обработку ошибок оставляют как осуществление для читателя:-)
JSch jsch = new JSch();
String knownHostsFilename = "/home/username/.ssh/known_hosts";
jsch.setKnownHosts( knownHostsFilename );
Session session = jsch.getSession( "remote-username", "remote-host" );
{
// "interactive" version
// can selectively update specified known_hosts file
// need to implement UserInfo interface
// MyUserInfo is a swing implementation provided in
// examples/Sftp.java in the JSch dist
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
// OR non-interactive version. Relies in host key being in known-hosts file
session.setPassword( "remote-password" );
}
session.connect();
Channel channel = session.openChannel( "sftp" );
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
sftpChannel.get("remote-file", "local-file" );
// OR
InputStream in = sftpChannel.get( "remote-file" );
// process inputstream as needed
sftpChannel.exit();
session.disconnect();
Лучшее решение, которое я нашел, Paramiko. Существует версия Java.
У Вас также есть JFileUpload с дополнением SFTP (Java также): http://www.jfileupload.com/products/sftp/index.html
Хорошая абстракция сверху Jsch является Apache свободное-городское-население-vfs , который предлагает API виртуальной файловой системы, который делает доступ и запись файлов SFTP почти прозрачными. Работавший хорошо для нас.
Это было решением, которое я предложил http://sourceforge.net/projects/sshtools/ (большая часть обработки ошибок, опущенной для ясности). Это - выборка от мой блог
SshClient ssh = new SshClient();
ssh.connect(host, port);
//Authenticate
PasswordAuthenticationClient passwordAuthenticationClient = new PasswordAuthenticationClient();
passwordAuthenticationClient.setUsername(userName);
passwordAuthenticationClient.setPassword(password);
int result = ssh.authenticate(passwordAuthenticationClient);
if(result != AuthenticationProtocolState.COMPLETE){
throw new SFTPException("Login to " + host + ":" + port + " " + userName + "/" + password + " failed");
}
//Open the SFTP channel
SftpClient client = ssh.openSftpClient();
//Send the file
client.put(filePath);
//disconnect
client.quit();
ssh.disconnect();
Попробуйте edtFTPj / PRO , зрелую, надежную клиентскую библиотеку SFTP, которая поддерживает пулы соединений и асинхронные операции. Также поддерживает протоколы FTP и FTPS, что позволяет использовать все основы безопасной передачи файлов.
Я использую этот SFTP API под названием Zehon, он великолепен, настолько прост в использовании, с большим количеством примеров кода. Вот сайт http://www.zehon.com
hierynomus/sshj имеет полную реализацию SFTP версии 3 (что реализует OpenSSH)
Пример кода из SFTPUpload.java
package net.schmizz.sshj.examples;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.sftp.SFTPClient;
import net.schmizz.sshj.xfer.FileSystemFile;
import java.io.File;
import java.io.IOException;
/** This example demonstrates uploading of a file over SFTP to the SSH server. */
public class SFTPUpload {
public static void main(String[] args)
throws IOException {
final SSHClient ssh = new SSHClient();
ssh.loadKnownHosts();
ssh.connect("localhost");
try {
ssh.authPublickey(System.getProperty("user.name"));
final String src = System.getProperty("user.home") + File.separator + "test_file";
final SFTPClient sftp = ssh.newSFTPClient();
try {
sftp.put(new FileSystemFile(src), "/tmp");
} finally {
sftp.close();
}
} finally {
ssh.disconnect();
}
}
}
Ниже приведен пример использования общей VFS Apache:
FileSystemOptions fsOptions = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fsOptions, "no");
FileSystemManager fsManager = VFS.getManager();
String uri = "sftp://user:password@host:port/absolute-path";
FileObject fo = fsManager.resolveFile(uri, fsOptions);
Вот полный исходный код примера с использованием JSch , не беспокоясь о проверке ключа ssh.
import com.jcraft.jsch.*;
public class TestJSch {
public static void main(String args[]) {
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("username", "127.0.0.1", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("password");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
sftpChannel.get("remotefile.txt", "localfile.txt");
sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
}
}