2010-07-12 13 views
5

1) मैं foo.exe चलाने के लिए लिनक्स टर्मिनल फोन और एक फ़ाइल में उत्पादन को बचाने के लिए जावा का उपयोग कर रहा: जब मैं कोड में बाद में haha.file पढ़ने के लिए योजना बना रहे हैंलिनक्स टर्मिनल को कॉल करने के लिए जावा का उपयोग करना: आउटपुट को कैसे फ़्लश करें?

String[] cmd = {"/bin/sh", "-c", "foo >haha.file"}; 
    Runtime.getRuntime().exec(cmd); 

2) समस्या है , यह अभी तक नहीं लिखा गया है:

File f=new File("haha.file"); // return true 
in = new BufferedReader(new FileReader("haha.file")); 
reader=in.readLine(); 
System.out.println(reader);//return null 

3) के बाद ही कार्यक्रम किया जाता है haha.file लिखा जाएगा। मुझे केवल "राइटर्स" फ्लश करने का तरीका पता है, लेकिन यह नहीं पता कि कैसे स्टश फ्लश करना है। इस तरह। मैं जावा को टर्मिनल में फ़ाइल लिखने के लिए कैसे मजबूर कर सकता हूं?

अग्रिम धन्यवाद E.E.

उत्तर

0

में आप प्रक्रिया के पूरा होने के लिए प्रतीक्षा या तो कर सकते हैं:

Process p = Runtime.getRuntime().exec(cmd); 
int result = p.waitFor(); 

या p.getInputStream() का उपयोग प्रक्रिया के मानक आउटपुट से सीधे पढ़ने के लिए।

2

यह समस्या Runtime.exec की असीमित प्रकृति के कारण होती है। एक अलग प्रक्रिया में foo निष्पादित किया जा रहा है। फ़ाइल लिखने के लिए आपको Process.waitFor() पर कॉल करने की आवश्यकता है।

String[] cmd = {"/bin/sh", "-c", "foo >haha.file"}; 
Process process = Runtime.getRuntime().exec(cmd); 
// .... 
if (process.waitFor() == 0) { 
    File f=new File("haha.file"); 
    in = new BufferedReader(new FileReader("haha.file")); 
    reader=in.readLine(); 
    System.out.println(reader); 
} else { 
    //process did not terminate normally 
} 
+1

इस दृष्टिकोण से सावधान रहें। Exec() का उपयोग करते समय stdout/stderr स्ट्रीम के साथ छिपे हुए नास्टियां हैं। प्रतीक्षा करने के लिए आपको वास्तव में आउटपुट/त्रुटि धाराओं का उपभोग करने की ज़रूरत है जबकि प्रतीक्षा करें() अवरुद्ध हो रहा है अन्यथा यह कभी वापस नहीं आ सकता है क्योंकि stdout/err buffers भरते हैं और फोर्क प्रक्रियाओं को अवरुद्ध करते हैं। चेकआउट अपाचे कॉमन्स-एक lib के लिए निष्पादन जो इसे हल करता है। –

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