我正在尝试为简单的批处理文件提供输入,该文件需要两行输入:
@echo off
set /p file1="Enter: "
set /p file2="Enter: "
echo "1" > %file2%
我的代码是:
public static void main(String[] args) throws Exception {
Process p = new ProcessBuilder("cmd.exe", "/c", "test.cmd").start();
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()))) {
bw.write("1");
bw.newLine();
bw.write("2");
bw.newLine();
}
}
我预计将创建名为“2”的文件,但什么也没有发生。
这段代码有什么问题?
最佳答案
试试这个。
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
InputStream in = p.getInputStream()) {
in.read();
bw.write("1");
bw.newLine();
bw.flush();
bw.write("2");
bw.newLine();
bw.flush();
}
基本上,你必须在写作之前阅读内容。 否则,Java 甚至可能在子进程提示输入之前就开始写入。所以你的写法不会考虑。
别忘了冲水
您可以使用waitFor
进行调试,而无需读取。它将永远等待获取输入。
注意**,文件位置基于第二行中的输入。在您的情况下,它将在执行 java 的目录中创建。
相反,您可以尝试实际的路径,例如。
bw.write("C:/projects/test.txt");
将根据 cmd 中的命令在指定路径中创建
更新 我想我确实解释了为什么我们需要先调用 read 。让我尝试用我理解的方式详细解释一下。
通过调用process.getRunTime().exec
- 您正在创建可以并行运行的新进程
。您的主进程将立即开始进程。所以我们有两个进程(1.我们启动的主进程2.)都是并行运行的。假设主进程在子进程(cmd)提示之前执行下一行(写入)(因为两者是并行的。这可能会发生)。主进程在子进程上写入的内容都是浪费,因为子进程不处于监听模式。
这就是为什么我们从主进程中调用读取子进程的原因。这样主进程就会等待子进程提示输入。
关于java - 写几行批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994023/