Самый простой способ загрузки файлов с сервера SCP использует Commons VFS вместе с JSch:
import java.io.*;
import org.apache.commons.io.FileUtils;
import org.apache.commons.vfs2.*;
public class CopyRemoteFile {
public static void copyRemoteFiles(String host, String user, String remotePath, String localPath) throws IOException {
FileSystemOptions fsOptions = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fsOptions, "no");
SftpFileSystemConfigBuilder.getInstance().setIdentities(fsOptions,
new File[] { new File(FileUtils.getUserDirectoryPath() + "/.ssh/id_dsa") });
DefaultFileSystemManager fsManager = (DefaultFileSystemManager) VFS.getManager();
String uri = "sftp://" + user + "@" + host + "/" + remotePath;
FileObject fo = fsManager.resolveFile(uri, fsOptions);
FileObject[] files = fo.getChildren();
for (FileObject file : files) {
// We will be dealing with the files here only
if (file.getType() == FileType.FILE) {
FileUtils.copyInputStreamToFile(file.getContent().getInputStream(),
new File(localPath + "/" + file.getName().getBaseName()));
}
file.close();
}
fo.close();
fsManager.close();
}
}
Это просто пример, который я получил в моей вики, так что ничего фантазии. Но имейте в виду, что если вы закроете fsManager
, вы не сможете открыть его снова в той же виртуальной машине. Я получил эту проблему при тестировании этого решения ...
Хотя приведенный выше пример не импортирует классы JSch, вам все равно нужно поместить его в путь к классам.
В приведенном выше примере используется закрытый ключ для аутентификации с удаленного хоста. Вы можете легко изменить это, предоставив пароль и изменив uri, чтобы включить это.
Если вам нужно синхронизации файлы, вы можете сравнить даты файлов в локальной файловой системе (или БД, или любого другого источника информации) и удаленных файлов:
import java.io.*;
import org.apache.commons.io.*;
import org.apache.commons.vfs2.*;
import org.apache.commons.vfs2.impl.*;
import org.apache.commons.vfs2.provider.sftp.*;
public class CopyRemoteFile {
public static void copyRemoteFiles(final String host, final String user, final String remotePath, final String localPath)
throws IOException {
FileSystemOptions fsOptions = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fsOptions, "no");
SftpFileSystemConfigBuilder.getInstance().setIdentities(fsOptions,
new File[] { new File(FileUtils.getUserDirectoryPath() + "/.ssh/id_dsa") });
DefaultFileSystemManager fsManager = (DefaultFileSystemManager) VFS.getManager();
String uri = "sftp://" + user + "@" + host + "/" + remotePath;
FileObject fo = fsManager.resolveFile(uri, fsOptions);
FileObject[] files = fo.getChildren();
for (FileObject file : files) {
// We will be dealing with the files here only
File newFile = new File(localPath + "/" + file.getName().getBaseName());
if (file.getType() == FileType.FILE && newFile.lastModified() != file.getContent().getLastModifiedTime()) {
FileUtils.copyInputStreamToFile(file.getContent().getInputStream(), newFile);
newFile.setLastModified(file.getContent().getLastModifiedTime());
}
file.close();
}
fo.close();
fsManager.close();
}
}
Можете ли вы объяснить эту задачу более подробно? Синхронизация программно или вы просто ищете решение для приложения? Что вы понимаете под синхронизацией? –
Синхронизация - синхронизация. Я хотел сделать это программно. У меня есть каталог в моей Linux-машине, и я хотел загрузить/синхронизировать файлы в каталоге на свою локальную машину Windows. Я хотел сделать это программно, так как у меня есть кнопка с именем «sync», которая должна инициировать этот процесс. – Tivakar
Для меня _sync_ означает, что я хочу загрузить все новые и измененные файлы с удаленного хоста и загрузить новые и измененные файлы из локального каталога. Но это я. В любом случае - вы получили свой ответ :) –