【问题标题】:How to use Java JSch library to read remote file line by line?如何使用 Java JSch 库逐行读取远程文件?
【发布时间】:2014-09-04 05:00:50
【问题描述】:

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

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

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

我会尝试在那里加载代码,然后修改它以逐行读取远程文件而不是写入本地文件,但是一旦作者声明一个字节数组并开始,大部分代码对我来说都是希腊语从远程文件中读取字节。我承认这是我几乎不了解的事情; BufferedReader 提供了更高级别的接口。基本上我想这样做:How to read a large text file line by line using 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

    }
 }

【问题讨论】:

  • 我会使用cat(在远程主机上)而不是scp。然后逐行读取命令行的标准输出。
  • 您可以使用 jsch 通过 sftp 打开输入流并逐行读取

标签: java io jsch


【解决方案1】:

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

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

打开 sftp 通道后,there are methods 可以读取远程文件,让您以InputStream 访问文件的内容。如果您需要逐行阅读,可以将其转换为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(is);
     BufferedReader br = new BufferedReader(isr)) {
    // read from br
}

【讨论】:

  • 完美,这正是我所需要的。谢谢!
  • 这是标准的 sftp 功能。您无需使用“exec”通道运行命令来读取/传输文件。
  • 我正在尝试为远程 Windows 机器打开一个 sftp 并获取内容,但我收到了 filenotfound 异常。该文件以指定的路径存在。我还需要为 Windows 做些什么吗? InputStream 流 = channel.get("C:\\1.xml");
  • @artos stackoverflow.com/a/31519959/13317。如果您仍然遇到问题,请点击此页面顶部的“提出问题”按钮并提出新问题。
【解决方案2】:

JSch 库是功能强大的库,可用于从 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();
        }

整个程序请参考blog

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    相关资源
    最近更新 更多