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