2014-09-04 5 views
5

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

JSch kommt mit zwei Beispielklassen, die Dateien zu und von entfernten Hosts kopieren, nämlich ScpTo und ScpFrom. Ich bin daran interessiert, die Datei Zeile für Zeile vom Remote-Host 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 Cargo-Kult dort den Code versuchen würde, und ändern Sie es dann eine Remote-Datei Zeile für Zeile zu lesen, anstatt in einer lokalen Datei zu schreiben, aber die meisten des Code ist Griechisch für mich, sobald der Autor ein Byte-Array deklariert und beginnt Bytes aus der Remote-Datei zu lesen. Ich gebe zu, das ist etwas, das ich fast nicht verstehe; BufferedReader bietet eine viel höherwertige Schnittstelle. Im Wesentlichen möchte ich dies tun: How to read a large text file line by line using Java?

außer mit einem BufferReader, die auch remote-Dateien Zeile für Zeile lesen können, wenn der Host-Name und Benutzer-Anmeldeinformationen (Passwort, etc.), z. B. RemoteBufferReader?

Dies ist der Testcode, den ich geschrieben habe; Wie lese ich Zeile für Zeile in der Remote-Datei mit JSCh? Verwendung von SFTP als scp oder reine ssh

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 

    } 
} 
+0

Ich würde 'cat' (auf dem Remote-Host) anstelle von' scp' verwendet. Dann lies einfach das stdout des Befehls Zeile für Zeile. – Rob

+1

Sie können einen Eingangsstrom über sftp mit Jsch öffnen und lesen Sie diese Zeile für Zeile – nablex

Antwort

13

Um Dateien über ssh zu manipulieren, sind Sie besser dran. Jsch hat eingebaute Unterstützung für sftp. Sobald Sie eine Sitzung geöffnet haben, tun dies einen SFTP-Kanal zu öffnen:

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

Sobald Sie einen SFTP-Kanal geöffnet haben, there are methods eine Remote-Datei zu lesen, die Sie lassen Zugriff auf den Inhalt der Datei als InputStream. Sie können das auf 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(); 
} 
+0

Perfekt, das tat genau das, was ich brauchte. Vielen Dank! – user3898238

+0

Dies ist Standard-SFTP-Funktionalität. Sie müssen keine Befehle ausführen, die den "exec" -Kanal zum Lesen/Übertragen von Dateien verwenden. –

+0

Ich versuche, eine sftp für Remote-Windows-Maschine zu öffnen und den Inhalt zu bekommen, aber ich bekomme feilenotfound Ausnahme. Die Datei existiert mit dem angegebenen Pfad. Gibt es noch andere Überlegungen, die ich für Windows machen muss? InputStream stream = channel.get ("C: \\ 1.xml"); – artos

0

JSch Bibliothek die leistungsfähige Bibliothek, die verwendet werden kann Datei von SFTP-Server zu lesen. Im Folgenden finden Sie die getesteten Code-Datei von SFTP Standort Zeile für Zeile

 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 beachten Sie die blog für ganzes Programm zu lesen.