Java对我来说是新的。
我正在使用Runtime.getRuntime.exec(filename.bat)
执行批处理文件,此批处理文件执行命令ant encrypt.password -Dvalue=somevalue>log.txt
并将其输出重定向到log.txt文件。
我面临的问题是,如果我手动运行它,批处理文件工作正常,但是当程序执行它时,它只会创建空白' log.txt'
mybat.bat
批处理文件的内容如下:
cd/
c:
cd c:/ant_builds/thinclient
ant encrypt.password -Dvalue=someValue >C:/log.txt
Java代码如下:
Process p=Runtime.getRuntime.exec("C:\mybat.bat");
p.waitFor();
似乎在创建日志文件之后,同时命令正在执行控制来自进程。
我已经阅读了近50个线程但是没有得到解决方案。请帮帮我。
答案 0 :(得分:4)
使用ProcessBuilder创建流程并调用redirectOutput(File)
重定向并将输出附加到文件中。
试试这段代码:
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();
}
}
对于jdk 1.6或更低版本,请使用以下代码:
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();
}
}
我不确定ProcessBuilder参数的顺序和列表,因此请尝试使用它们以使代码正常工作。
答案 1 :(得分:0)
您还可以从公共文件中读取命令,并将输出和错误重定向到单独的文件。 Redirect.appendTo是为了避免进程覆盖现有日志。
试试这段代码:
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();
}