I’m developing java code that needs to simulate the following:
my_command < file.txt
I tested writing to STDIN but it doesn’t seem to be the solution.
Has someone already developed it?
Note, in the below code,
source is an instance of java.io.File
String commandLine = "myCommand";
Process process = Runtime.getRuntime().exec(commandLine);
new Thread(() -> {
try (BufferedWriter stdin = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
Scanner scanner = new Scanner(source)
){
String line;
while (scanner.hasNext()) {
line = scanner.nextLine();
stdin.write(line);
System.out.print(line);
}
stdin.flush();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
int ret = process.waitFor();
FYI my command is mysql
Advertisement
Answer
You should use class ProcessBuilder (rather than class Runtime).
I don’t know what your my_command is, so the below code uses cleartool.
First I create the text file containing the cleartool subcommands that I wish to execute.
hostinfo exit
(Note the empty last line of the file.)
I named this file exits_ct.txt
Now the java code that will run cleartool command, then enter the subcommands from the text file and print the command output to standard output.
import java.io.File;
import java.io.IOException;
public class PrcBldTs {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("cleartool");
pb.redirectInput(new File("exits_ct.txt"));
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
try {
Process proc = pb.start(); // throws java.io.IOException
int result = proc.waitFor(); // throws java.lang.InterruptedException
System.out.println("result: " + result);
}
catch (IOException | InterruptedException x) {
x.printStackTrace();
}
}
}
When I run the above code, I get the following output:
MY_COMP: ClearCase 9.0.0.0 (Windows NT 6.2 (build 9200) Pentium) result: 0