diff --git a/libraries-io/README.md b/libraries-io/README.md
new file mode 100644
index 0000000000..f8ea2f1be8
--- /dev/null
+++ b/libraries-io/README.md
@@ -0,0 +1,4 @@
+
+### Relevant Articles:
+
+
diff --git a/libraries-io/pom.xml b/libraries-io/pom.xml
new file mode 100644
index 0000000000..5b78ae9442
--- /dev/null
+++ b/libraries-io/pom.xml
@@ -0,0 +1,40 @@
+
+
+ 4.0.0
+ libraries-io
+ libraries-io
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+ com.jcraft
+ jsch
+ ${jsch.version}
+
+
+ com.hierynomus
+ sshj
+ ${sshj.version}
+
+
+ org.apache.commons
+ commons-vfs2
+ ${vfs.version}
+
+
+
+
+
+ 0.1.55
+ 0.27.0
+ 2.4
+
+
diff --git a/libraries-io/src/main/resources/input.txt b/libraries-io/src/main/resources/input.txt
new file mode 100644
index 0000000000..a10db923e5
--- /dev/null
+++ b/libraries-io/src/main/resources/input.txt
@@ -0,0 +1 @@
+This is a sample text content
\ No newline at end of file
diff --git a/libraries-io/src/test/java/org/baeldung/java/io/remote/SftpFileTransferLiveTest.java b/libraries-io/src/test/java/org/baeldung/java/io/remote/SftpFileTransferLiveTest.java
new file mode 100644
index 0000000000..192153bc90
--- /dev/null
+++ b/libraries-io/src/test/java/org/baeldung/java/io/remote/SftpFileTransferLiveTest.java
@@ -0,0 +1,106 @@
+package org.baeldung.java.io.remote;
+
+import java.io.IOException;
+
+import org.apache.commons.vfs2.FileObject;
+import org.apache.commons.vfs2.FileSystemManager;
+import org.apache.commons.vfs2.Selectors;
+import org.apache.commons.vfs2.VFS;
+import org.junit.Test;
+
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
+import com.jcraft.jsch.SftpException;
+
+import net.schmizz.sshj.SSHClient;
+import net.schmizz.sshj.sftp.SFTPClient;
+import net.schmizz.sshj.transport.verification.PromiscuousVerifier;
+
+public class SftpFileTransferLiveTest {
+
+ private String remoteHost = "HOST_NAME_HERE";
+ private String username = "USERNAME_HERE";
+ private String password = "PASSWORD_HERE";
+ private String localFile = "src/main/resources/input.txt";
+ private String remoteFile = "welcome.txt";
+ private String localDir = "src/main/resources/";
+ private String remoteDir = "remote_sftp_test/";
+ private String knownHostsFileLoc = "/Users/USERNAME/known_hosts_sample";
+
+ @Test
+ public void whenUploadFileUsingJsch_thenSuccess() throws JSchException, SftpException {
+ ChannelSftp channelSftp = setupJsch();
+ channelSftp.connect();
+ channelSftp.put(localFile, remoteDir + "jschFile.txt");
+ channelSftp.exit();
+ }
+
+ @Test
+ public void whenDownloadFileUsingJsch_thenSuccess() throws JSchException, SftpException {
+ ChannelSftp channelSftp = setupJsch();
+ channelSftp.connect();
+ channelSftp.get(remoteFile, localDir + "jschFile.txt");
+ channelSftp.exit();
+ }
+
+ @Test
+ public void whenUploadFileUsingSshj_thenSuccess() throws IOException {
+ SSHClient sshClient = setupSshj();
+ SFTPClient sftpClient = sshClient.newSFTPClient();
+ sftpClient.put(localFile, remoteDir + "sshjFile.txt");
+ sftpClient.close();
+ sshClient.disconnect();
+ }
+
+ @Test
+ public void whenDownloadFileUsingSshj_thenSuccess() throws IOException {
+ SSHClient sshClient = setupSshj();
+ SFTPClient sftpClient = sshClient.newSFTPClient();
+ sftpClient.get(remoteFile, localDir + "sshjFile.txt");
+ sftpClient.close();
+ sshClient.disconnect();
+ }
+
+ @Test
+ public void whenUploadFileUsingApacheVfs_thenSuccess() throws IOException {
+ FileSystemManager manager = VFS.getManager();
+ FileObject local = manager.resolveFile(System.getProperty("user.dir") + "/" + localFile);
+ FileObject remote = manager.resolveFile("sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt");
+ remote.copyFrom(local, Selectors.SELECT_SELF);
+ local.close();
+ remote.close();
+ }
+
+ @Test
+ public void whenDownloadFileUsingApacheVfs_thenSuccess() throws IOException {
+ FileSystemManager manager = VFS.getManager();
+ FileObject local = manager.resolveFile(System.getProperty("user.dir") + "/" + localDir + "vfsFile.txt");
+ FileObject remote = manager.resolveFile("sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteFile);
+ local.copyFrom(remote, Selectors.SELECT_SELF);
+ local.close();
+ remote.close();
+ }
+
+ // ====== ssh-keyscan -H -t rsa remoteHost >> known_hosts_sample
+
+ private ChannelSftp setupJsch() throws JSchException {
+ JSch jsch = new JSch();
+ jsch.setKnownHosts(knownHostsFileLoc);
+ Session jschSession = jsch.getSession(username, remoteHost);
+ jschSession.setPassword(password);
+ //jschSession.setConfig("StrictHostKeyChecking", "no");
+ jschSession.connect();
+ return (ChannelSftp) jschSession.openChannel("sftp");
+ }
+
+ private SSHClient setupSshj() throws IOException {
+ SSHClient client = new SSHClient();
+ client.addHostKeyVerifier(new PromiscuousVerifier());
+ client.connect(remoteHost);
+ client.authPassword(username, password);
+ return client;
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 64d92acfce..7347d4dfd5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -506,6 +506,7 @@
libraries-security
libraries-server
libraries-http
+ libraries-io
linkrest
logging-modules
lombok