Skip to content
Advertisement

How make code to simulate the command < file.txt

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
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement