Java JSch 库逐行读取远程文件

在本文中,我们将学习如何使用 JSch 库逐行读取远程文件。我们建立了与远程服务器的连接并创建了 SFTP 通道。然后,我们使用BuffferedReader类逐行读取每个文件。

Java 安全通道 (JSch)库提供了用于将 Java 应用程序连接到远程服务器的 API,从而实现了各种远程操作。其强大功能之一是能够直接从远程服务器读取文件,而无需将其下载到本地计算机。

在本教程中,我们将学习如何使用 JSch 连接到远程服务器并逐行读取特定文件。

Maven 依赖
首先,让我们将 JSch依赖项添加到pom.xml中:

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

该依赖项提供用于建立与远程服务器的连接并打开 SSH 文件传输协议 (SFTP) 通道进行文件传输的类。

连接远程服务器
让我们创建变量来存储到远程服务器的连接详细信息:

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;

HOST可以是远程服务器的域名或 IP 地址。USER是用于向远程服务器进行身份验证的用户名,而PRIVATE_KEY表示SSH私钥身份验证的路径。SSH 端口默认为 22。

接下来,让我们创建一个会话:

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

在这里,我们创建JSch的一个实例,它是JSch功能的入口点。接下来,我们加载用于身份验证的密钥。然后,我们使用连接详细信息创建一个新的Session对象。为简单起见,我们禁用了严格的主机密钥检查。

使用 JSch 读取远程文件
建立会话后,让我们为 SFTP 创建一个新的通道:

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

在上面的代码中,我们创建了一个ChannelSftp实例,并通过调用它的connect()方法来建立连接。

现在我们已经打开了 SFTP 通道,我们可以列出远程目录中的文件,以轻松找到我们想要读取的文件。

我们定义一个字段来存储远程文件的路径:

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

接下来让我们远程连接该文件并读取其内容:

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

这里,我们创建了一个BufferedReader实例,它接受InputStream对象作为参数,以便有效地读取文件。由于InputStream返回的是字节流,InputStreamReader可帮助将其解码为字符。

最后,我们调用BufferedReader对象上的readLine() 方法并使用 while 循环遍历所有行。

我们不需要明确关闭BufferedReader对象,因为它在try-with-resources块中使用。

关闭连接
成功读取文件后,我们需要关闭 SSH 会话和 SFTP 通道:

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

在上面的代码中,我们调用Session和ChannelSftp对象上的disconnect()方法来关闭连接并释放资源。