Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ProcessBuilder问题_Java_Processbuilder - Fatal编程技术网

Java ProcessBuilder问题

Java ProcessBuilder问题,java,processbuilder,Java,Processbuilder,我在使用>操作符写入Process Builder中的文件时遇到问题。实际进程将正常运行,让我使用InputStreamReaderetc解析输出。我希望使用命令行(例如>test.json)将进程写入文件 这是我的代码 try { //process builder used to run a Python script ProcessBuilder process = new ProcessBuilder("python", System.getProperty("

我在使用>操作符写入
Process Builder中的文件时遇到问题。实际进程将正常运行,让我使用
InputStreamReader
etc解析输出。我希望使用命令行(例如>test.json)将进程写入文件

这是我的代码

try {
    //process builder used to run a Python script 
    ProcessBuilder process = new ProcessBuilder("python",
    System.getProperty("user.dir")+"\\createJson.py","--structure","cloc.csv",
                                  "--weights","EntityEffort.csv",">","a.json");

    process.directory(new File("c:\\users\\chris\\desktop\\test2"));
    Process p = process.start();

} catch(Exception e) {
    e.printStackTrace();
}

正如@JimGarrison指出的,
由shell解释。在这里,您可以直接启动
createJson.py
的进程,而不需要shell

在UNIX中,可以使用ProcessBuilder启动shell,方法是:

process = new ProcessBuilder("bash", "someCommand", ">", "outputfile");
类似的东西可能会在Windows和
cmd.exe
中使用

然而,这不是很好的做法。这是命令注入攻击的机会。调用外部流程是最后一种方法,您应该尽量减少在这些流程中所做的事情

因此,最好还是坚持现有的,并用Java处理重定向到文件的问题。ProcessBuilder javadoc给出了一个示例:

File log = new File("log");
processBuilder.redirectOutput(Redirect.appendTo(log));

正如@JimGarrison指出的,
由shell解释。在这里,您可以直接启动
createJson.py
的进程,而不需要shell

在UNIX中,可以使用ProcessBuilder启动shell,方法是:

process = new ProcessBuilder("bash", "someCommand", ">", "outputfile");
类似的东西可能会在Windows和
cmd.exe
中使用

然而,这不是很好的做法。这是命令注入攻击的机会。调用外部流程是最后一种方法,您应该尽量减少在这些流程中所做的事情

因此,最好还是坚持现有的,并用Java处理重定向到文件的问题。ProcessBuilder javadoc给出了一个示例:

File log = new File("log");
processBuilder.redirectOutput(Redirect.appendTo(log));

是否有任何异常或问题仅限于无法获取输出文件?重定向符号由命令shell解释。在Linux中,您必须调用shell(即bash),然后执行命令行。我不想把它作为一个答案发布,因为我不确定它在Windows中是如何工作的(例如,cmd.exe是否在这里的封面下被调用)但我怀疑您需要调用cmd.exe并将其传递给要执行的命令行。您是否遇到任何异常或问题仅限于无法获取输出文件?重定向符号由命令shell解释。在Linux中,您必须调用shell(即bash),然后执行命令行。我没有将此作为答案发布,因为我不确定这在Windows中是如何工作的(即,是否在此处调用cmd.exe),但我怀疑您需要调用cmd.exe并将其传递给要执行的命令行。