如何使用Java SFTP Library JSch将文件从一个目录传输到另一个目录?

2022-09-02 21:56:21

我需要使用JSch库对文件传输进行编程。我有一个简单的目录,有两个文件夹 -

enter image description here

在文件夹中,我有一个位图图像。该文件夹只是一个空文件夹。我的目标是使用SFTP将图像从SFTP_1传输到SFTP_2。SFTP_1SFTP_2

以下是我到目前为止的代码:

FileTransfer fileTransfer = new FileTransfer();              
      
JSch jsch = new JSch();

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

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

sftp.rename(
    "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_1\\house.bmp",
    "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_2\\house.bmp");
session.disconnect();

我想做的是简单地将文件从计算机中的一个目录传输到另一个目录。任何提示赞赏,谢谢!


答案 1

请注意,要在两个文件夹之间进行复制,不需要使用 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 方法。


答案 2

实际上,JSch是为远程工作而设计的,文件系统修改是此类工作的类型之一。@Edwin Buck 答案使用网络在远程主机上的本地文件夹之间进行复制。有更好的方法:

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

我手上没有窗口,因此我的示例是针对unix的。但这个想法很简单:在远程主机上执行复制命令。


推荐