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