2011-01-19 13 views
18

मेरे पास एक प्रोग्राम है test.java:System.setOut() के साथ Runtime.getRuntime()। Exec() आउटपुट को रीडायरेक्ट करें।

import java.io.*; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     System.setOut(new PrintStream(new FileOutputStream("test.txt"))); 
     System.out.println("HelloWorld1"); 
     Runtime.getRuntime().exec("echo HelloWorld2"); 
    } 
} 

यह हैलोवर्ल्ड 1 और हैलोवर्ल्ड 2 को फ़ाइल text.txt पर प्रिंट करना है। हालांकि, जब मैं फ़ाइल देखता हूं, तो मुझे केवल HelloWorld1 दिखाई देता है।

  1. HelloWorld2 कहां गया? क्या यह पतली हवा में गायब हो गया?

  2. आइए कहें कि मैं HelloWorld2 को test.txt पर भी रीडायरेक्ट करना चाहता हूं। मैं कमांड में सिर्फ ">> test.txt" नहीं जोड़ सकता क्योंकि मुझे पहले से ही एक फ़ाइल मिल जाएगी। फिर मेरे द्वारा इसे कैसे किया जाएगा?

+0

क्या यह रनटाइम का उपयोग करने की आवश्यकता है? – Navi

+0

@Navi: क्या कोई विकल्प है ?! कहना। मैं जानना चाहता हूँ! या आप ProcessBuilder का उपयोग करने का मतलब है –

उत्तर

33

Runtime.exec का मानक आउटपुट स्वचालित रूप से कॉलर के मानक आउटपुट पर नहीं भेजा जाता है।

कुछ ऐसा करने की तरह कुछ - फोर्क प्रक्रिया के मानक आउटपुट तक पहुंच प्राप्त करें, इसे पढ़ें और फिर इसे लिखें। ध्यान दें कि प्रक्रिया उदाहरण के getInputStream() विधि का उपयोग कर फोर्कड प्रक्रिया से आउटपुट माता-पिता के लिए उपलब्ध है।

public static void main(String[] args) throws Exception { 
    System.setOut(new PrintStream(new FileOutputStream("test.txt"))); 
    System.out.println("HelloWorld1"); 

    try { 
     String line; 
     Process p = Runtime.getRuntime().exec("echo HelloWorld2"); 

     BufferedReader in = new BufferedReader(
       new InputStreamReader(p.getInputStream())); 
     while ((line = in.readLine()) != null) { 
     System.out.println(line); 
     } 
     in.close(); 
    } 
    catch (Exception e) { 
     // ... 
    } 
} 
2

System.out निष्पादन() को कॉल करके आपके द्वारा बनाई गई नई प्रक्रिया से stdout नहीं है। यदि आप "हैलोवर्ल्ड 2" देखना चाहते हैं तो आपको exec() कॉल से वापस लौटाई गई प्रक्रिया प्राप्त करनी होगी, फिर उस से getOutputStream() को कॉल करें।

5

चूंकि जेडीके 1.5 में java.lang.ProcessBuilder है जो std और err streams को भी संभालता है। यह java.lang.Runtime के प्रतिस्थापन का प्रकार है और आपको इसका उपयोग करना चाहिए।

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