2014-09-04 8 views
5

मैं लाइन द्वारा फ़ाइल लाइन पढ़ने के लिए जावा का उपयोग करने की कोशिश कर रहा हूं, जो बहुत आसान है (stackoverflow.com पर इसके लिए कई समाधान हैं), लेकिन यहां चेतावनी यह है कि फ़ाइल रिमोट सर्वर पर स्थित है, और यह एक स्थानीय प्रति प्राप्त करना संभव नहीं है (यह एक .txt फ़ाइल में लाखों अमेज़ॅन समीक्षाओं का एक विशाल संग्रह है)।लाइन द्वारा दूरस्थ फ़ाइल लाइन पढ़ने के लिए जावा JSch लाइब्रेरी का उपयोग कैसे करें?

जेएसएच दो उदाहरण वर्गों के साथ आता है जो दूरस्थ होस्ट्स, अर्थात् एसपीपीटीओ और एसपीपीफ़्रॉम से फ़ाइलों की प्रतिलिपि बनाते हैं। मुझे लाइन से रिमोट होस्ट लाइन से फ़ाइल पढ़ने में दिलचस्पी है; ScpFrom पूरी चीज़ को स्थानीय फ़ाइल में कॉपी करने का प्रयास करेगा, जिसमें उम्र लग जाएगी।

यहाँ ScpFrom के लिए एक लिंक है: http://www.jcraft.com/jsch/examples/ScpFrom.java.html

मैं कोड वहाँ कोड के सबसे कार्गो पंथ की कोशिश करेंगे और फिर एक स्थानीय फ़ाइल पर लिखने लाइन द्वारा एक दूरस्थ फ़ाइल लाइन पढ़ बजाय इसे संशोधित, लेकिन एक बार लेखक बाइट सरणी घोषित करता है और दूरस्थ फ़ाइल से बाइट पढ़ने शुरू करता है तो मेरे लिए यूनानी है। मैं स्वीकार करूंगा कि यह ऐसा कुछ है जिसकी मुझे लगभग कोई समझ नहीं है; BufferedReader एक बहुत उच्च स्तर इंटरफेस प्रदान करता है। अनिवार्य रूप से मैं यह करना चाहता हूं: How to read a large text file line by line using Java?

एक बफर रीडर का उपयोग करने के अलावा जो लाइन द्वारा रिमोट फाइल लाइन को भी पढ़ सकता है, अगर मेजबान का नाम और उपयोगकर्ता प्रमाण-पत्र (पासवर्ड इत्यादि) प्रदान किया जाता है, यानी रिमोटबफर रीडर?

यह मैंने लिखा है टेस्ट कोड है; जेएससीएच का उपयोग कर लाइन द्वारा रिमोट फाइल लाइन में मैं कैसे पढ़ूं?

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

मैं 'scp' की बजाय' cat' (रिमोट होस्ट पर) का उपयोग करता था। फिर बस लाइन-दर-पंक्ति कमांड के stdout पढ़ें। – Rob

+1

आप jsch के साथ sftp पर इनपुटस्ट्रीम खोल सकते हैं और उस पंक्ति को – nablex

उत्तर

13

एसएसएच के माध्यम से फ़ाइलों में हेरफेर करने के लिए, आप एसपीपी या शुद्ध एसएसएच से एसएफटीपी का उपयोग बंद कर रहे हैं। जेएसएच ने एसएफटीपी के लिए अंतर्निहित समर्थन किया है। एक बार जब आप एक सत्र खोलने के बाद, एक SFTP चैनल खोलने के लिए ऐसा करते हैं:

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

एक बार जब आप जो आप करते हैं एक दूरस्थ फ़ाइल को पढ़ने के लिए एक SFTP चैनल, there are methods खोल दिया है एक InputStream के रूप में फ़ाइल की सामग्री तक पहुंच। आप एक Reader है कि में बदल सकते हैं अगर आप पंक्ति-दर-पंक्ति पढ़ने की जरूरत है:

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

पर सही पढ़ सकते हैं, यह वही था जो मुझे चाहिए था। धन्यवाद! – user3898238

+0

यह मानक sftp कार्यक्षमता है। फ़ाइलों को पढ़ने/स्थानांतरित करने के लिए आपको "exec" चैनल का उपयोग करके कमांड चलाने की आवश्यकता नहीं है। –

+0

मैं दूरस्थ विंडोज मशीन के लिए एक sftp खोलने की कोशिश कर रहा हूं और सामग्री प्राप्त कर रहा हूं, लेकिन मुझे filenotfound अपवाद मिल रहा है। फ़ाइल निर्दिष्ट पथ के साथ मौजूद है। क्या विंडोज़ के लिए मुझे कोई अन्य सोचने की ज़रूरत है? इनपुटस्ट्रीम स्ट्रीम = channel.get ("सी: \\ 1.xml"); – artos

0

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 देखें परीक्षण किया कोड है।

संबंधित मुद्दे