如何使用Java JSch库逐行读取远程文件?

我正在尝试使用Java逐行读取文件,这非常简单(在stackoverflow.com上有多个解决方案),但需要注意的是该文件位于远程服务器上,而不是可以获得本地副本(它是单个.txt文件中数百万亚马逊评论的大量集合)。

JSch附带了两个示例类,用于将文件复制到远程主机或从远程主机复制文件,即ScpTo和ScpFrom。 我有兴趣逐行从远程主机读取文件; ScpFrom会尝试将整个内容复制到本地文件中,这需要很长时间。

以下是ScpFrom的链接: http : //www.jcraft.com/jsch/examples/ScpFrom.java.html

我会尝试将代码存放在那里,然后修改它以逐行读取远程文件而不是写入本地文件,但是一旦作者声明了一个字节数组并开始从中读取字节,大部分代码都是希腊语。远程文件。 我承认这是我几乎不了解的事情; BufferedReader提供了更高级别的接口。 基本上我想这样做: 如何使用Java逐行读取大型文本文件?

除了使用BufferReader,它还可以逐行读取远程文件,如果提供了主机名和用户凭据(密码等),即RemoteBufferReader?

这是我写的测试代码; 如何使用JSCh逐行读取远程文件?

public class test2 { static String user = "myusername"; static String host = "user@remotehost"; static String password = "mypasswd"; static String rfile = "/path/to/remote/file/on/remote/host"; public static void main(String[] args) throws FileNotFoundException, IOException, JSchException { JSch jsch=new JSch(); Session session=jsch.getSession(user, host, 22); session.setPassword(password); session.connect(); // exec 'scp -f rfile' remotely String command="scp -f "+rfile; Channel channel=session.openChannel("exec"); ((ChannelExec)channel).setCommand(command); // get I/O streams for remote scp OutputStream out=channel.getOutputStream(); channel.connect() //no idea what to do next } } 

要通过ssh操作文件,最好使用sftp而不是scp或纯ssh。 Jsch内置了对sftp的支持。 打开会话后,执行此操作以打开sftp频道:

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

打开sftp通道后, 有一些方法可以读取远程文件,使您可以将文件的内容作为InputStream 。 如果需要逐行Reader ,可以将其转换为Reader

 InputStream stream = sftp.get("/some/file"); try { BufferedReader br = new BufferedReader(new InputStreamReader(stream)); // read from br } finally { stream.close(); } 

使用try with resources语法,您的代码可能看起来更像这样:

 try (InputStream is = sftp.get("/some/file"); InputStreamReader isr = new InputStreamReader(stream); BufferedReader br = new BufferedReader(isr)) { // read from br } 

JSch库是function强大的库,可用于从SFTP服务器读取文件。 下面是逐行读取SFTP位置文件的测试代码

  JSch jsch = new JSch(); Session session = null; try { session = jsch.getSession("user", "127.0.0.1", 22); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword("password"); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); ChannelSftp sftpChannel = (ChannelSftp) channel; InputStream stream = sftpChannel.get("/usr/home/testfile.txt"); try { BufferedReader br = new BufferedReader(new InputStreamReader(stream)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException io) { System.out.println("Exception occurred during reading file from SFTP server due to " + io.getMessage()); io.getMessage(); } catch (Exception e) { System.out.println("Exception occurred during reading file from SFTP server due to " + e.getMessage()); e.getMessage(); } sftpChannel.exit(); session.disconnect(); } catch (JSchException e) { e.printStackTrace(); } catch (SftpException e) { e.printStackTrace(); } 

请参考博客了解整个计划。