Java: Redirecting output of .bat file in other tex

2019-07-21 16:29发布

Java is new to me. I am executing a batch file using Runtime.getRuntime.exec(filename.bat) and this batch file executes a commandant encrypt.password -Dvalue=somevalue>log.txt and redirects its output to a log.txt file. Problem that I am facing is batch file is working fine if I run it manually however when program executes it ,it just creates blank 'log.txt'

Content of mybat.bat batch file is as below:

cd/
c:
cd c:/ant_builds/thinclient
ant encrypt.password -Dvalue=someValue >C:/log.txt

Java code is as below:

Process p=Runtime.getRuntime.exec("C:\mybat.bat");
p.waitFor();

It seems that after creating the log file,meantime command is executing control comes out from process.

I have read almost 50 threads here however did not get the solution. Please help me out.

2条回答
ら.Afraid
2楼-- · 2019-07-21 17:31

Use ProcessBuilder to create your process and call redirectOutput(File) to redirect and append output to a file.

Try this code:

public class Test {
    ProcessBuilder builder;
    Path log;

    public Test() {
        try
        {
            log = Paths.get("C:\\log.txt");
            if (!Files.exists(log))
            {
                Files.createFile(log);
            }
            builder = new ProcessBuilder("ant", "encrypt.password", "-Dvalue=someValue");
            builder.directory(Paths.get("C:\\ant_builds\\thinclient").toFile());
            builder.redirectOutput(ProcessBuilder.Redirect.appendTo(log.toFile()));
            builder.start();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}

For jdk 1.6 or less, use the following code:

public class Test {
    ProcessBuilder builder;
    Path log;
    Process process;
    BufferedReader br;
    PrintWriter pw;
    Charset charset = Charset.forName("UTF-8");

    public Test() {
        try {
            log = new File("C:\\log.txt");
            if (!log.exists()) {
                log.createNewFile();
            }
            builder = new ProcessBuilder("ant", "encrypt.password","-Dvalue=someValue");
            builder.directory(new File("C:\\ant_builds\\thinclient"));
            builder.redirectErrorStream(true);
            process = builder.start();
            br = new BufferedReader(new InputStreamReader(process.getInputStream(),charset));
            pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(log, true), charset));

            (new Thread() {
                public void run() {
                    try {
                        while (process.isAlive()) {
                            String s = null;
                            while ((s = br.readLine()) != null) {
                                pw.print(s);
                                pw.flush();
                            }
                        }
                        br.close();
                        pw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}   

I'm not sure about the order and list of ProcessBuilder arguments so try to play with them to get your code working.

查看更多
在下西门庆
3楼-- · 2019-07-21 17:36

You can also read commands from a common file and redirect output and erros to a sepearate files. Redirect.appendTo is to avoid the process from overiting the existing logs.

Try this code:

try {
File commands = new File("D:/Sample/Commands.txt"); 
File output = new File("D:/Sample/Output.txt"); 
File errors = new File("D:/Sample/ErrorsLog.txt"); 

ProcessBuilder pb = new ProcessBuilder("cmd");

System.out.println(pb.redirectInput());
System.out.println(pb.redirectOutput());
System.out.println(pb.redirectError()); 

pb.redirectInput(commands);
pb.redirectError(Redirect.appendTo(errors));
pb.redirectOutput(Redirect.appendTo(output));

pb.redirectInput();
pb.redirectOutput();
pb.redirectError(); 

pb.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
查看更多
登录 后发表回答