it-swarm.com.de

Wie verwendet man die Java JSch-Bibliothek, um die Remote-Datei Zeile für Zeile zu lesen?

Ich versuche, Java zu verwenden, um eine Datei Zeile für Zeile zu lesen, was sehr einfach ist (auf stackoverflow.com gibt es dafür mehrere Lösungen), aber der Nachteil hierbei ist, dass sich die Datei auf einem Remote-Server befindet und nicht Es ist möglich, eine lokale Kopie zu erhalten (es ist eine riesige Sammlung von Amazon-Rezensionen in einer einzigen TXT-Datei).

JSch enthält zwei Beispielklassen, die Dateien von und zu entfernten Hosts kopieren, nämlich ScpTo und ScpFrom. Ich bin daran interessiert, die Datei vom entfernten Host Zeile für Zeile zu lesen. ScpFrom würde versuchen, das Ganze in eine lokale Datei zu kopieren, was ewig dauern würde.

Hier ist ein Link zu ScpFrom: http://www.jcraft.com/jsch/examples/ScpFrom.Java.html

Ich würde versuchen, den Code dort zu speichern und dann zu ändern, um eine entfernte Datei Zeile für Zeile zu lesen, anstatt in eine lokale Datei zu schreiben, aber der größte Teil des Codes ist Griechisch für mich, sobald der Autor ein Byte-Array deklariert und damit beginnt, Bytes zu lesen die entfernte Datei. Ich gebe zu, das ist etwas, was ich fast nicht verstehe. BufferedReader bietet eine wesentlich höhere Schnittstelle. Im Wesentlichen möchte ich Folgendes tun: Wie lese ich eine große Textdatei Zeile für Zeile mit Java?

außer, dass ein BufferReader verwendet wird, der auch Remote-Dateien Zeile für Zeile lesen kann, wenn der Host-Name und die Benutzeranmeldeinformationen (Kennwort usw.) angegeben werden, d. h. RemoteBufferReader?

Dies ist der Testcode, den ich geschrieben habe. Wie kann ich die Remote-Datei mit JSCh Zeile für Zeile einlesen?

public class test2
 {
    static String user = "myusername";
    static String Host = "[email protected]";
    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

    }
 }
6
user3898238

Um Dateien über ssh zu bearbeiten, ist sftp besser geeignet als scp oder pure ssh. Jsch hat eine integrierte Unterstützung für SFTP. Sobald Sie eine Sitzung geöffnet haben, öffnen Sie einen Sftp-Kanal:

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

Wenn Sie einen Sftp-Kanal geöffnet haben, gibt es es gibt Methoden , um eine Remote-Datei zu lesen, mit der Sie als InputStream auf den Inhalt der Datei zugreifen können. Sie können das in eine Reader konvertieren, wenn Sie Zeile für Zeile lesen müssen:

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

Wenn Sie try mit resources syntax verwenden, könnte Ihr Code folgendermaßen aussehen:

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

Die JSch-Bibliothek ist die leistungsfähige Bibliothek, die zum Lesen von Dateien vom SFTP-Server verwendet werden kann. Unten ist der getestete Code, um die Datei Zeile für Zeile vom SFTP-Speicherort zu lesen

        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();
        }

Bitte beziehen Sie sich auf das Blog für das gesamte Programm.

1
Ankur jain