मैं एक जावा प्रोग्राम लिखना चाहता हूं जो बाहरी "जावा myprog < input.txt> output.txt" कमांड चलाता है। अंतिम लक्ष्य इस आदेश को दो अलग-अलग कार्यक्रमों पर चलाने और उनकी आउटपुट समानता की तुलना उनके संबंधित आउटपुट फाइलों से करना है।एक जावा प्रोग्राम जो बाहरी "जावा myprog < input.txt > output.txt" चलाता है
मुझे लगता है कि मैंने बाहरी प्रोग्राम चलाने के लिए प्रोसेसबिल्डर का उपयोग करने के बारे में हर प्रासंगिक लेख और उस बाहरी कार्यक्रम में उपयोगकर्ता इनपुट को संभालने के बारे में कुछ प्रविष्टियां पढ़ी हैं, लेकिन मुझे अभी भी काम नहीं मिल रहा है। मैंने जो पढ़ा है, उससे मुझे लगता है कि सबसे अच्छा तरीका ऊपर दिए गए सटीक कमांड को चलाने के लिए नहीं है, बल्कि इसके बजाय input.txt फ़ाइल को पढ़ें और प्रक्रिया ऑब्जेक्ट में बाइट-बाय-बाइट फ़ीड करें, फिर आउटपुट एकत्र करें और इसे आउटपुट पर लिखें .txt ... मैं अन्य विकल्पों के लिए 100% खुला हूं।
मैंने अपने रीडिंग के आधार पर नीचे दिए गए कोड को एक साथ रखा है। ऐसा लगता है कि input.txt से इनपुट को सही ढंग से फ़ीड करना है, लेकिन जब मैं बाहरी प्रोग्राम के आउटपुट को कंसोल पर प्रिंट करने का प्रयास करता हूं, तो प्रोग्राम उस बिंदु पर लटकता है जहां (आश्चर्य) उपयोगकर्ता इनपुट में मेरी इनपुट की उम्मीद है।
मुझे रीडायरेक्ट एररस्ट्रीम (सत्य) लाइन के साथ और बिना एक ही समस्याएं मिलती हैं।
मैं वास्तव में जावा में होना चाहता हूं क्योंकि मैं स्रोत कोड को उन लोगों के साथ साझा करने की योजना बना रहा हूं जिनके प्रोग्राम आउटपुट की तुलना मैं करूंगा, और वे मुख्य रूप से केवल जावा से परिचित हैं।
import java.io.*;
import java.util.*;
public class test7 {
public static void main(String args[]) {
try {
// WANT: "java myprog <input.txt> output.txt"
String inputFile = "input.txt";
String outputFile = "output.txt";
ProcessBuilder pb = new ProcessBuilder("java","myprog");
pb.redirectErrorStream(true); // merge stdout, stderr of process
Process p = pb.start();
// write input to the running program
OutputStream pos = p.getOutputStream();
InputStream fis = new FileInputStream(inputFile);
int read = 0;
while ((read = fis.read()) != -1) {
pos.write(read);
}
fis.close();
// get output of running program
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
// HANGS HERE WHEN USER INPUT REQUIRED
String lineRead;
while ((lineRead = br.readLine()) != null) {
System.out.println(lineRead);
}
}
catch (IOException e) {
e.printStackTrace();
}
} // end main
}
यहाँ myprog.java की सामग्री है:
import java.io.*;
public class myprog {
public static void main(String args[]) throws IOException {
System.out.println("Hello world!");
System.out.println("Enter something:");
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
// the readLine() command causes ProcessBuilder to hang
cin.readLine();
}
}
और input.txt फ़ाइल सिर्फ
p
output.txt फ़ाइल होना चाहिए है
Hello world!
Enter something:
उपयोगकर्ता इनपुट द्वारा आपका क्या मतलब है? क्या आप या तो अपने myprog या कम से कम इसके सबसे प्रासंगिक भागों दिखा सकते हैं? साथ ही, यदि आप बेहतर सहायता चाहते हैं तो कृपया जावा नामकरण सम्मेलनों का पालन करें। गैर मानक नामकरण (कक्षा नामों के पहले अक्षर को कैपिटल करने सहित) का उपयोग आपके कोड को भ्रमित कर देता है। –
मैंने कुछ समय पहले इसका उत्तर दिया .. http://stackoverflow.com/questions/3062305/executing-shell-commands-from-java/3062874#3062874 – dsmith
@ होवरक्राफ्टफुलऑफेल: मैंने myprog.java की सामग्री को विवरण में जोड़ा। कक्षा के नाम को पूंजीकरण के लिए मैं क्षमा चाहता हूं। – missthang