问题描述
请注意,要在两个文件夹之间进行复制,不需要使用SFTP。一个人可以在不涉及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库对文件传输进行编程。我有一个包含两个文件夹的简单目录
在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:\\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"); // /SFTP_1/file.txt
//sftpChannel.get("remotefile.txt","localfile.txt");
//sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
}
}
我想做的只是将文件从计算机中的一个目录传输到另一个目录。任何提示表示赞赏,谢谢!