web-dev-qa-db-ja.com

Java JSchライブラリを使用してリモートファイルを1行ずつ読み取る方法は?

Javaを使用してファイルを1行ずつ読み取るのは非常に簡単です(stackoverflow.comには複数の解決策があります)。ただし、ファイルが配置されているという警告があります。リモートサーバー上で、ローカルコピーを取得することはできません(これは、単一の.txtファイル内の数百万のAmazonレビューの膨大なコレクションです)。

JSchには、リモートホストとの間でファイルをコピーする2つのサンプルクラス、ScpToとScpFromが付属しています。リモートホストからファイルを1行ずつ読み取ることに興味があります。 ScpFromは全体をローカルファイルにコピーしようとしますが、これには時間がかかります。

ScpFromへのリンクは次のとおりです。 http://www.jcraft.com/jsch/examples/ScpFrom.Java.html

私はそこでコードをカーゴカルトし、ローカルファイルに書き込むのではなくリモートファイルを行ごとに読み取るように変更しようとしますが、著者がバイト配列を宣言してからバイトの読み取りを開始すると、コードのほとんどはギリシャ語ですリモートファイル。これは私がほとんど理解していないことだと認めます。 BufferedReaderは、はるかに高いレベルのインターフェースを提供します。基本的にこれを行いたい: Javaを使用して大きなテキストファイルを1行ずつ読み取る方法

ホスト名とユーザー資格情報(パスワードなど)が提供されている場合、リモートファイルを1行ずつ読み取ることもできるBufferReaderを使用することを除いて、RemoteBufferReader?

これは私が書いたテストコードです。 JSChを使用してリモートファイルを1行ずつ読み込むにはどうすればよいですか?

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

    }
 }
9
user3898238

Sshを介してファイルを操作するには、scpまたは純粋なsshよりもsftpを使用する方がよいでしょう。 Jschにはsftpのサポートが組み込まれています。セッションを開いたら、次のようにしてsftpチャネルを開きます。

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

Sftpチャネルを開いたら、 メソッドがあります を使用して、ファイルのコンテンツにInputStreamとしてアクセスできるリモートファイルを読み取ります。行ごとに読み取る必要がある場合は、これをReaderに変換できます。

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

リソースで試す 構文を使用すると、コードは次のようになります。

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

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 を参照してください。

4
Ankur jain