Как перенести файл из одного каталога в другой с помощью Java SFTP Library JSch?

мне нужно запрограммировать передачу файлов с помощью библиотеки JSch. У меня есть простой каталог с двумя папками -

enter image description here

на SFTP_1 папка, у меня есть растровое изображение. И SFTP_2 папка - это просто пустая папка. Моя цель-передать изображение с помощью SFTP из SFTP_1 в SFTP_2 .

вот мой код до сих пор :

import com.jcraft.jsch.*;

import java.awt.Desktop;

import java.nio.channels.Channel;


public class FileTransfer {

    public FileTransfer() {  
        super();                               
    }

       public static void main (String[] args) {
        FileTransfer fileTransfer = new FileTransfer();              

    JSch jsch = new JSch();

          try {

              String host = "127.0.0.1";
              int port = 22;

              String user = "user";
              Session session = jsch.getSession(user, host, port);      
              session = jsch.getSession("username", "127.0.0.1", 22);
              session.connect();

             //Channel channel  = session.openChannel("sftp");
              ChannelSftp sftp = null;
              sftp = (ChannelSftp)session.openChannel("sftp") ; //channel;
              //channel.connect();
              //Channel channel = session.openChannel("shell");  



             sftp.rename("C:UsersADMINDesktopWorkConnectOne_BancorpJava_WorkSFTP_1house.bmp", "C:UsersADMINDesktopWorkConnectOne_BancorpJava_WorkSFTP_2house.bmp");  //  /SFTP_1/file.txt 
              //sftpChannel.get("remotefile.txt", "localfile.txt");
              //sftpChannel.exit();
              session.disconnect();

          } catch (JSchException e) {
              e.printStackTrace();  
          } catch (SftpException e) {
              e.printStackTrace();
          }
       }
}

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

3 ответов


обратите внимание, что для копирования между двумя папками, не нужно использовать SFTP. Можно копировать из одной папки в другую без использования протокола SFTP, который в основном используется для удаленного копирования файлов с локальной машины на удаленную машину или с удаленной машины на (ту же или другую) удаленную машину или с удаленной машины на локальную машину.

это потому, что FTP-это сетевой протокол. Поэтому его использование (или любой из связанных с ним протоколов) происходит для использования сети (или моделируемой сети).

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

чтобы скопировать файлы между папками на одной машине, самый простой способ сделать это-не использовать JSch, например

private static void copyFileUsingJava7Files(File source, File dest)
        throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

есть другие методы, и если вы действительно хотите использовать JSch, вам нужно понять, что JSch должен быть предоставлено много "дополнительной" информации для подключения к машине, на которой вы находитесь, потому что она попытается подключиться к этой машине, как если бы она подключалась через сеть

Session sessionRead = jsch.getSession("username", "127.0.0.1", 22);
sessionRead.connect();

Session sessionWrite = jsch.getSession("username", "127.0.0.1", 22);
sessionWrite.connect();

ChannelSftp channelRead = (ChannelSftp)sessionRead.openChannel("sftp");
channelRead.connect();

ChannelSftp channelWrite = (ChannelSftp)sessionWrite.openChannel("sftp");
channelWrite.connect();

PipedInputStream pin = new PipedInputStream(2048);
PipedOutputStream pout = new PipedOutputStream(pin);

channelRead.get("/path/to/your/file/including/filename.txt", pout);
channelWrite.put(pin, "/path/to/your/file/destination/including/filename.txt");

channelRead.disconnect();
channelWrite.disconnect();

sessionRead.disconnect();
sessionWrite.disconnect();

в приведенном выше коде отсутствует проверка ошибок, обработка исключений и процедуры отката, если файлы отсутствуют, сети не работают и т. д. Но вы должны понять основную идею.

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


на самом деле JSch предназначен для удаленной работы, и модификация файловой системы является одной из таких работ. @Edwin Buck answer использует сеть для взаимодействия между локальными папками на удаленном хосте. Есть лучший подход:

session.connect();
ChannelExec exec = (ChannelExec) session.openChannel("exec");
exec.setCommand("cp a.out b.out");
exec.connect();

У меня нет окон на руке, в результате мой образец для Unix. Но идея проста: выполните команду copy на удаленном хосте.


Если оригинальный плакат на самом деле ищет рабочий пример jsch в действии между двумя различными FTP-сайтами, вот:

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
...
JSch jsch = new JSch();
JSch session = null;
try {
  session = jsch.getSession(userid, sourceservername, sourceserverport);
  session.setPassword(sourceserverpassword);
  Properties props = new Properties();
  props.put("StrictHostKeyChecking", "no");
  session.setConfig(props);
  session.connect();
  Channel channel = session.openChannel("sftp");
  channel.connect();
  ChanelSftp channelsftp = (ChannelSftp) channel;
  channelsftp.cd(sourcefilepath);
  channelsftp.lcd(localfilepath);
  FileOutputStream fos = new FileOutputStream(new File(localfilepath + "/" + localfilename));
  channelsftp.get(sourcefilename, fos);
  fos.flush();
  fos.close();
  channelsftp.disconnect()
  session.disconnect();
} catch (Exception e) {
  e.printStackTrace();
}

на практике вы можете разбить эти действия на отдельные операторы try{}catch(){} blocked, чтобы ввести более подробные отчеты об ошибках, а также добавить любые информационные выходные строки для информирования пользователя о состоянии и т. д. Но это приведет тебя туда. По общему признанию, в то время как примеры JSch лучше, чем большинство таких примеров из бесплатные библиотеки, даже хорошие, как этот, могут быть некоторые упущения среди них вокруг деталей, которые могут сделать или сломать вашу попытку заставить вещи работать. Надеюсь, это поможет, если не оригинальный плакат, то кто-то еще ищет рабочий пример JSch. Как только у вас это работает, это идет как шарм, так что это стоит того.