写几行到批处理

时间:2014-04-10 16:42:13

标签: java batch-file input process output

我正在尝试为简单的批处理文件提供输入,期望输入两行:

@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”的文件,但没有任何反应。

这段代码出了什么问题?

1 个答案:

答案 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)提示之前执行下一行(写入)(因为两者并行。这可能发生)。主进程在子进程上写入的内容将是浪费,因为子进程不处于侦听模式。

这就是我们从主进程调用子进程的原因。这样主进程就会等到子进程提示输入。