我正在尝试为简单的批处理文件提供输入,期望输入两行:
@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”的文件,但没有任何反应。
这段代码出了什么问题?
答案 0 :(得分:1)
试试这个。
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中的命令在指定路径中创建
UPDATE 我以为我确实解释了为什么我们需要先调用read。让我尝试以我理解的方式详细解释。
通过调用process.getRunTime().exec
- 您正在创建可以并行运行的新process
。您的主要流程将立即开始处理。所以我们有两个进程(1.主要2.我们开始的进程)都是并行运行的。假设主进程在子进程(cmd)提示之前执行下一行(写入)(因为两者并行。这可能发生)。主进程在子进程上写入的内容将是浪费,因为子进程不处于侦听模式。
这就是我们从主进程调用子进程的原因。这样主进程就会等到子进程提示输入。