2014-09-04 21 views
5

Tôi đang cố gắng sử dụng Java để đọc một dòng tệp, rất đơn giản (có nhiều giải pháp cho việc này trên stackoverflow.com), nhưng báo trước ở đây là tệp nằm trên một máy chủ từ xa và nó không thể lấy một bản sao cục bộ (nó là một bộ sưu tập hàng triệu đánh giá Amazon trong một tệp .txt đơn).Làm thế nào để sử dụng thư viện Java JSch để đọc dòng tệp từ xa?

JSch đi kèm với hai lớp ví dụ sao chép tệp đến và từ máy chủ từ xa, cụ thể là ScpTo và ScpFrom. Tôi quan tâm đến việc đọc tệp từ dòng máy chủ từ xa theo dòng; ScpFrom sẽ cố gắng sao chép toàn bộ điều vào một tập tin địa phương, mà sẽ mất lứa tuổi.

Dưới đây là một liên kết đến ScpFrom: http://www.jcraft.com/jsch/examples/ScpFrom.java.html

tôi sẽ cố gắng để sùng bái hàng mã ở đó và sau đó sửa đổi nó để đọc một dòng tập tin từ xa bằng dòng chứ không phải là viết vào một tập tin địa phương, nhưng hầu hết các mã là tiếng Hy Lạp đối với tôi khi tác giả khai báo một mảng byte và bắt đầu đọc các byte từ tệp từ xa. Tôi thừa nhận đây là điều tôi hầu như không hiểu; BufferedReader cung cấp một giao diện mức cao hơn nhiều. Về cơ bản, tôi muốn thực hiện điều này: How to read a large text file line by line using Java?

ngoại trừ việc sử dụng Bộ đệm cũng có thể đọc tệp từ xa theo dòng, nếu được cung cấp tên máy chủ và thông tin người dùng (mật khẩu, v.v.), tức là RemoteBufferReader?

Đây là mã thử nghiệm mà tôi đã viết; làm thế nào để đọc trong dòng tập tin từ xa bằng đường dây bằng cách sử dụng JSCh?

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

Tôi đã sử dụng 'cat' (trên máy chủ từ xa) thay vì' scp'. Sau đó, chỉ cần đọc stdout của dòng lệnh-by-line. – Rob

+1

Bạn có thể mở một luồng đầu vào trên sftp với jsch và đọc dòng đó theo dòng – nablex

Trả lời

13

Để thao tác tệp qua ssh, bạn nên sử dụng sftp hơn sp hoặc ssh tinh khiết. Jsch đã tích hợp hỗ trợ cho sftp. Một khi bạn đã mở một phiên, làm điều này để mở một kênh sftp:

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

Khi bạn đã mở một kênh sftp, there are methods để đọc một tập tin từ xa mà cho phép bạn truy cập vào nội dung của tập tin như một InputStream. Bạn có thể chuyển đổi thành số Reader nếu bạn cần đọc từng dòng:

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

Hoàn hảo, điều này đã làm chính xác những gì tôi cần. Cảm ơn bạn! – user3898238

+0

Đây là chức năng sftp tiêu chuẩn. Bạn không cần chạy các lệnh bằng cách sử dụng kênh "exec" để đọc/truyền tệp. –

+0

Tôi đang cố gắng để mở một sftp cho máy cửa sổ từ xa và nhận được nội dung, nhưng tôi nhận được ngoại lệ filenotfound. Tệp hiện có với đường dẫn được chỉ định. Có người nào khác nghĩ tôi cần làm cho cửa sổ không? InputStream stream = channel.get ("C: \\ 1.xml"); – artos

0

Thư viện JSch là thư viện mạnh có thể được sử dụng để đọc tệp từ máy chủ SFTP. Dưới đây là mã được kiểm tra để đọc tệp từ dòng vị trí SFTP theo dòng

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

Vui lòng tham khảo blog cho toàn bộ chương trình.

Các vấn đề liên quan