1. Overview

The Java Secure Channel (JSch) library provides an API for connecting Java applications to remote servers, enabling various remote operations. One of its powerful features is the ability to read files directly from a remote server without downloading them to the local machine.

In this tutorial, we’ll learn how to use JSch to connect to a remote server and read a specific file line by line.

2. Maven Dependency

First, let’s add the JSch dependency to the pom.xml:

<dependency>
    <groupId>com.github.mwiede</groupId>
    <artifactId>jsch</artifactId>
    <version>0.2.20</version>
</dependency>

The dependency provides classes to establish a connection to a remote server and open an SSH File Transfer Protocol (SFTP) channel for file transfer.

3. Connecting to the Remote Server

Let’s create variables to store the connection details to the remote server:

private static final String HOST = "HOST_NAME";
private static final String USER = "USERNAME";
private static final String PRIVATE_KEY = "PRIVATE_KEY";
private static final int PORT = 22;

The HOST could be the domain name or IP address of the remote server. The USER is the username for the authentication to the remote server while the PRIVATE_KEY represents a path to the SSH private key authentication. SSH port is 22 by default.

Next, let’s create a session:

JSch jsch = new JSch();
jsch.addIdentity(PRIVATE_KEY);
Session session = jsch.getSession(USER, HOST, PORT);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();

Here, we create an instance of JSch which is the entry point for the JSch functionality. Next, we load the key for authentication. Then, we create a new Session object with our connection details. For simplicity, we disable strict host key checking.

4. Read Remote Files With JSch

After establishing a session, let’s create a new channel for SFTP:

ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();

In the code above, we create an instance of ChannelSftp and establish a connection by invoking the connect() method on it.

Now that we’ve opened an SFTP channel, we can list the files in the remote directory to easily spot the files we want to read.

Let’s define a field to store the path of the remote file:

private static final String filePath = "REMOTE_DIR/examplefile.txt";

Next, let’s connect to the file remotely and read its content:

InputStream stream = channelSftp.get(filePath);
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream))) {
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        LOGGER.info(line);
    }
}

Here, we create an Instance of BufferedReader which accepts the InputStream object as an argument for effective file reading. Since InputStream returns a byte stream, InputStreamReader helps decode it into characters.

Finally, we invoke the readLine() method on the BufferedReader object and use the while loop to iterate through all the lines.

We don’t need to explicitly close the BufferedReader object because it’s used within the try-with-resources block.

5. Closing the Connection

After successfully reading the file, we need to close the SSH session and the SFTP channel:

channelSftp.disconnect();
session.disconnect();

In the code above, we invoke the disconnect() method on the Session and ChannelSftp objects to close the connections and free resources.

6. Conclusion

In this article, we learn how to read a remote file line by line using the JSch library. We established a connection to the remote server and created an SFTP channel. Then, we use the BuffferedReader class to read each file line by line.

As always, the full source code for the example is available over on GitHub.