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

2024-01-22

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

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

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

我会尝试将代码传送到那里,然后修改它以逐行读取远程文件而不是写入本地文件,但是一旦作者声明了一个字节数组并开始从其中读取字节,大多数代码对我来说都是希腊语远程文件。我承认这是我几乎无法理解的事情; BufferedReader 提供了更高级别的接口。本质上我想这样做:如何使用Java逐行读取大型文本文件? https://stackoverflow.com/questions/5868369/how-to-read-a-large-text-file-line-by-line-using-java

除了使用缓冲区读取器之外,如果提供主机名和用户凭据(密码等),也可以逐行读取远程文件,即远程缓冲区读取器?

这是我写的测试代码;如何使用 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 通道后,有方法 http://epaul.github.io/jsch-documentation/javadoc/com/jcraft/jsch/ChannelSftp.html#get-java.lang.String-读取远程文件,该文件允许您以访问文件的方式访问该文件的内容InputStream。您可以将其转换为Reader如果您需要逐行阅读:

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

Using 尝试使用资源 https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html语法,您的代码可能看起来更像这样:

try (InputStream is = sftp.get("/some/file");
     InputStreamReader isr = new InputStreamReader(is);
     BufferedReader br = new BufferedReader(isr)) {
    // read from br
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐