Java JSch 庫逐行讀取遠端文件
1. 概述
Java 安全通道 (JSch) 程式庫提供了一個 API,用於將 Java 應用程式連接到遠端伺服器,從而實現各種遠端操作。其強大的功能之一是能夠直接從遠端伺服器讀取文件,而無需將其下載到本機電腦。
在本教程中,我們將學習如何使用 JSch 連接到遠端伺服器並逐行讀取特定檔案。
2.Maven依賴
首先,我們將 JSch依賴項加入pom.xml
中:
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>0.2.20</version>
</dependency>
此依賴項提供了用於建立與遠端伺服器的連接並開啟 SSH 檔案傳輸協定 (SFTP) 通道以進行檔案傳輸的類別。
3. 連接遠端伺服器
讓我們建立變數來儲存遠端伺服器的連接詳細資訊:
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
物件。為簡單起見,我們停用嚴格的主機金鑰檢查。
4.使用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
區塊中使用。
5. 關閉連接
成功讀取檔案後,我們需要關閉 SSH 會話和 SFTP 通道:
channelSftp.disconnect();
session.disconnect();
在上面的程式碼中,我們呼叫Session
和ChannelSftp
物件上的disconnect()
方法來關閉連線並釋放資源。
六、結論
在本文中,我們學習如何使用 JSch 函式庫逐行讀取遠端檔案。我們建立了與遠端伺服器的連接並創建了 SFTP 通道。然後,我們使用BuffferedReader
類別逐行讀取每個檔案。
與往常一樣,該範例的完整原始程式碼可在 GitHub 上取得。