繁体   English   中英

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

[英]How to use Java JSch library to read remote file line by line?

我正在尝试使用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库是功能强大的库,可用于从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();
        }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM