开发者

Using Java to call Linux terminal: How to flush the output?

开发者 https://www.devze.com 2023-01-06 17:33 出处:网络
1) I\'m using Java to call Linux terminal to run foo.exe and save the output in a file: String[] cmd = {\"/bin/sh\", \"-c\", \"foo >haha.file\"};

1) I'm using Java to call Linux terminal to run foo.exe and save the output in a file:

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

2) The problem is when I plan to read haha.file later in the code, it hasn't been written yet:

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) Only after the program is done will the haha.file be written. I only know how to flush "Writers" but don't know how to flush sth. like this. How can I f开发者_运维百科orce java to write the file in the terminal?

Thanks in advance E.E.


This problem is caused by the asynchronous nature of Runtime.exec. foo is being executed in a seperate process. You need to call Process.waitFor() to insure the file has been written.

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
}


You can either wait for the completion of the process:

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

Or use the p.getInputStream() to read directly from the standard output of the process.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号