2014-09-04 12 views
5

Próbuję użyć języka Java, aby odczytać wiersz pliku po wierszu, co jest bardzo proste (istnieje wiele rozwiązań tego problemu na stackoverflow.com), ale zastrzeżenie jest takie, że plik znajduje się na serwerze zdalnym, a nie można uzyskać lokalnej kopii (jest to ogromna kolekcja milionów recenzji Amazon w jednym pliku .txt).Jak korzystać z biblioteki Java JSch do odczytywania zdalnego pliku wiersz po linii?

JSch zawiera dwie przykładowe klasy, które kopiują pliki do iz hostów zdalnych, a mianowicie ScpTo i ScpFrom. Interesuje mnie czytanie pliku ze zdalnej linii hosta po linii; ScpFrom spróbuje skopiować całość do lokalnego pliku, który zajmie całe wieki.

Tu jest link do ScpFrom: http://www.jcraft.com/jsch/examples/ScpFrom.java.html

chciałbym spróbować kulty cargo kod tam, a następnie zmodyfikować go czytać zdalnego pliku linia po linii, zamiast pisać do pliku lokalnego, ale większość kodu jest dla mnie po grecku, gdy autor deklaruje tablicę bajtów i rozpoczyna odczytywanie bajtów ze zdalnego pliku. Przyznaję, że jest to coś, czego prawie nie rozumiem; BufferedReader zapewnia interfejs o znacznie wyższym poziomie. Zasadniczo chcę to zrobić: How to read a large text file line by line using Java?

z wyjątkiem użycia BufferReader, który może również czytać pliki zdalne wiersz po linii, jeśli podano nazwę hosta i poświadczenia użytkownika (hasło itp.), Tj. RemoteBufferReader?

To jest kod testowy, który napisałem; jak czytać w zdalnym pliku linii po linii używając JSCh?

+0

Użyłbym 'cat' (na zdalnym hoście) zamiast' scp'. Następnie po prostu przeczytaj stdout polecenia linia po linii. – Rob

+1

Możesz otworzyć strumień wejściowy przez sftp za pomocą jsch i odczytać tę linię po linii – nablex

Odpowiedz

13

Aby manipulować plikami przez ssh, lepiej używać sftp niż scp lub pure ssh. Jsch ma wbudowaną obsługę sftp. Po otwarciu sesji, to zrobić, aby otworzyć kanał sftp:

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

Po otwarciu kanału SFTP there are methods czytać zdalnego pliku, które umożliwiają dostęp do zawartości pliku jako InputStream. można przekonwertować do Reader jeśli trzeba przeczytać wiersz po wierszu:

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

Doskonale, to zrobiło dokładnie to, czego potrzebowałem. Dziękuję Ci! – user3898238

+0

Jest to standardowa funkcjonalność sftp. Nie trzeba uruchamiać poleceń za pomocą kanału "exec", aby czytać/przesyłać pliki. –

+0

Próbuję otworzyć sftp dla zdalnego komputera z systemem Windows i pobrać zawartość, ale dostaję wyjątek Filenotfound. Plik istnieje z określoną ścieżką. Czy są jakieś inne myśli, które muszę zrobić dla Windows? Strumień InputStream = channel.get ("C: \\ 1.xml"); – artos

0

jsch biblioteka jest potężne biblioteki, które mogą być używane do odczytu pliku z serwera SFTP. Poniżej jest testowany kod można odczytać pliku z lokalizacji linii SFTP przez linię

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

proszę skierować blog dla całego programu.

Powiązane problemy