当前位置: 首页 > 面试题库 >

如何在Windows和JDK 6u45上将处理输出管道传输到文件

祖麻雀
2023-03-14
问题内容

我有以下Windows批处理文件(run.bat):

@echo off
echo hello batch file to sysout

还有以下Java代码,这些代码运行批处理文件并将输出重定向到文件:

public static void main(String[] args) throws IOException {
    System.out.println("Current java version is: " + System.getProperty("java.version"));

    ProcessBuilder pb =
            new ProcessBuilder("cmd.exe", "/c",
                    "run.bat"
                     ,">>", "stdout.txt","2>>", "stderr.txt"
                    );
    System.out.println("Command is: " + pb.command());

    Process proc = pb.start();

    InputStream in = proc.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));

    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

    int exitValue = proc.exitValue();
    System.out.println("Exit value: " + exitValue);
}

在包含JDK6u43的JDK上,我得到以下输出:

Current java version is: 1.6.0_29
Command is: [cmd.exe, /c, run.bat, >>, stdout.txt, 2>>, stderr.txt]
Exit value: 0

然后将脚本输出写入文件。从JDK 6u45和7开始,我得到以下输出:

Current java version is: 1.6.0_45
Command is: [cmd.exe, /c, run.bat, >>, stdout.txt, 2>>, stderr.txt]
hello batch file to sysout
Exit value: 0

而且什么也不会写入输出文件。

这可能与或可能与Runtime.exec()中所做的更改无关,该更改在以下网址中进行了描述:http
:
//www.oracle.com/technetwork/java/javase/6u45-relnotes-1932876.html

在Windows上启动将输出重定向到文件的过程的正确方法是什么?

注意:在实际情况下,要执行的命令可能包含带空格的参数,如:

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c",
"run.bat", "Some Input With Spaces", 
">>", "stdout.txt","2>>", "stderr.txt");

问题答案:

这里有几点建议:

  • 带空格的输入是否需要被视为单个String(带空格),或者在实际的多个输入中将其标识?如果是第一个选项,我建议在Windows运行时引用它:
    ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", 
    "run.bat", "\"Some Input With Spaces\"", 
    ">>", "stdout.txt","2>>", "stderr.txt");
  • 而不是使用shell将输入重定向到stdout.txt和stderr.txt,为什么不使用Java使用getOutputStream()和getErrorStream()?这是使用Guava IO包的示例。当然,您可能希望将它们放在单独的线程中,需要适当的异常处理等。
    InputStream stdout = new BufferedInputStream(proc.getInputStream());
    FileOutputStream stdoutFile = new FileOutputStream("stdout.txt");
    ByteStreams.copy(stdout, stdoutFile);

    InputStream stderr = new BufferedInputStream(proc.getErrorStream());
    FileOutputStream stderrFile = new FileOutputStream("stderr.txt");
    ByteStreams.copy(stderr, stderrFile);

    stdout.close();
    stderr.close();
    stdoutFile.close();
    stderrFile.close();
  • 另一个选择,为什么不创建一个run.bat将进行重定向的包装器?
    @echo off
    cmd.exe /c run.bat "%1" >> "%2" 2>> "%3"


 类似资料:
  • 问题内容: 我在完全冻结JVM的应用程序中发现一个错误。产生的stacktrace将为开发人员提供有价值的信息,我想从Java控制台中检索它。JVM崩溃时,控制台被冻结,我无法再复制包含的文本。 是否可以将Java控制台直接通过管道传输到文件,或通过其他某种方式访问​​Java应用程序的控制台输出? 更新:我忘记提了,没有更改代码。我是手动测试仪。 更新2:这是在Windows XP下,它实际上是

  • 问题内容: 我想在我的ipython Notebook中运行bash脚本,并将输出另存为python变量中的字符串,以进行进一步操作。基本上,我想将bash magic的输出传递给一个变量,例如,类似这样的输出: 问题答案: 怎么使用这个: 而不是魔术?使用该符号将以下命令作为shell命令运行,结果全部存储在中。要运行多个命令并收集所有命令的输出,只需组合一个快速的shell脚本即可。

  • 了解如何使用“文件”面板在 Dreamweaver 中管理文件和文件夹、在本地和远程站点之间传输和同步它们。此外,还可了解在 Dreamweaver 中自动恢复功能如何运行。 使用 Dreamweaver 中的“文件”面板,您可以访问和管理与您的站点关联的文件。在“文件”面板中,您可以将视图切换为“FTP 视图”或“Git 视图”,进而使用 FTP 服务器或 Git 存储库来管理文件。 要打开“文

  • 问题内容: 本质上,我正在尝试替换: 为了避免使用硬盘驱动器,请在C ++中使用管道。这是我的代码: 我绝对可以确保上述字符串已正确初始化。但是,发生了两件事对我来说没有意义: (1)我正在执行的程序报告“输入文件为空”。由于我未使用“ <”调用程序,因此不应期望输入文件。相反,它应该期待键盘输入。此外,它应该阅读“ gulp_command”中包含的文本。 (2)程序的报告(通过标准输出提供)出

  • 问题内容: 我有一种情况,我需要从Node.js / Express RESTful API返回一个很大的对象,并将其转换为JSON字符串。 但是,这似乎无法很好地扩展。具体来说,它在连接1-2个客户端的测试机上运行良好,但我怀疑当许多客户端同时请求大型JSON对象时,此操作可能会浪费CPU和内存使用率。 我四处寻找一个异步JSON库,但是我发现的唯一一个库似乎有问题(特别是,我收到了[Range

  • 问题内容: 在bash中,调用将在stdout上显示该命令的任何输出。 调用会将该命令的任何输出重定向到指定的文件(在本例中为“输出”)。 有没有一种方法可以将输出重定向到文件 并 在stdout上显示? 问题答案: 您想要的命令名为 : 例如,如果您只关心标准输出: 如果要包括stderr,请执行以下操作: 将通道2(stderr /标准错误)重定向到通道1(stdout /标准输出),以便将两