Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
使用ProcessBuilder在.java文件中运行shell命令_Java_Shell_Processbuilder - Fatal编程技术网

使用ProcessBuilder在.java文件中运行shell命令

使用ProcessBuilder在.java文件中运行shell命令,java,shell,processbuilder,Java,Shell,Processbuilder,我遇到了一个令人讨厌的小错误,我不知道如何解决它。我尝试做的很简单:使用ProcessBuilder运行一个外部.java文件。就像那滴滴暗示的那样 问题是运行并创建此ProcessBuilder的文件与我要运行的另一个文件位于不同的目录中 我想做的是: String command[] = {"javac",JAVA_FILE_LOCATION}; ProcessBuilder processBuilder = new ProcessBuilder("cd"); Process process

我遇到了一个令人讨厌的小错误,我不知道如何解决它。我尝试做的很简单:使用ProcessBuilder运行一个外部.java文件。就像那滴滴暗示的那样

问题是运行并创建此ProcessBuilder的文件与我要运行的另一个文件位于不同的目录中

我想做的是:

String command[] = {"javac",JAVA_FILE_LOCATION};
ProcessBuilder processBuilder = new ProcessBuilder("cd");
Process process0 = processBuilder.start();
要重置目录,请执行以下操作:

processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
编译另一个文件

if( process.getErrorStream().read() != -1 ){
    print("Compilation Errors",process.getErrorStream());
}
这里只是一些错误处理。然而,它并没有通过这个错误处理部分。我想不出做这件事的正确方法。以下是错误消息:

my_PC:Processes user$ java -jar process.jar
************* Compilation Errors***********************
avac: file not found: /Users/Desktop/Piano.java
Usage: javac <options> <source files>
use -help for a list of possible options
Exception in thread "main" java.lang.IllegalThreadStateException: process hasn't exited
at java.lang.UNIXProcess.exitValue(UNIXProcess.java:423)
at my.package.address.Main.main(Main.java:28)
使用第一个ProcessBuilder执行的cd命令仅影响该子进程,它不会更改主执行程序的工作目录。 运行第二个ProcessBuilder时,它将以工作目录作为主程序, 完全不受前一个ProcessBuilder执行的cd的影响

要从其他目录执行程序,请使用目录。。。ProcessBuilder的方法:

顺便说一句,路径/Users/Desktop/piano.java看起来很奇怪。 Mac上用户桌面的路径通常是/Users/username/desktop, 因此,代码中的路径意味着您的用户名是Desktop, 这很不寻常

而且,为了更容易使用该程序, 我建议将基本目录路径/Users/username/Desktop放在一个变量中, 而不是在多个地方硬编码。
这样就更容易进行更改,无需在多个位置进行编辑。

我明白了,这解释了很多。因此,如果我想在编译后运行该文件。它就像process=newprocessbuildernewstring[]{java,Piano}.directorynewfileusers/Desktop/.start@MarcoNeves没错现在我没有这样的文件或目录。这可能是一个愚蠢的问题,但文件名是否必须包含在路径中?我的路径是/Users/Desktop,文件piano.java就在那里。没有包语句或任何东西。@MarcoNeves如果您只看到Piano.java而没有看到Piano.class,那么编译步骤似乎不起作用。如果您在终端的/Users/Desktop中运行javac Piano.java,而不是通过您的程序,那么它是否真的工作了?是的,javac Piano.java工作了,而javapiano按照它应该的方式运行。
package some.random.package;

import java.io.*;

public class Main {
/**
* Provide absolute JAVA file path
*/
private static final String JAVA_FILE_LOCATION = "/Users/Desktop/piano.java";

    public static void main(String args[]) throws IOException
    {
        String command[] = {"javac",JAVA_FILE_LOCATION};
        ProcessBuilder processBuilder = new ProcessBuilder(command).directory(new File("/Users/Desktop/"));
        Process process = processBuilder.start();
        if( process.getErrorStream().read() != -1 ){
            print("Compilation Errors",process.getErrorStream());
        }
        /**
        * check if compile is successful
        * 0 => successful
        */
        if( process.exitValue() == 0 )
        {
            process = new ProcessBuilder(new String[]{"java","piano"}).directory(new File("/Users/Desktop/")).start();
            if( process.getErrorStream().read() != -1 )
                print("Errors ",process.getErrorStream());
            else
                print("Output ",process.getInputStream());

            /**
            * Check if RuntimeException or Errors encounter during execution then print errors on console
            * Otherwise print Output
            */
        }
    }
    private static void print(String status,InputStream input) throws IOException
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(input));
        System.out.println("************* "+status+"***********************");
        String line = null;
        while((line = in.readLine()) != null ){
        System.out.println(line);
      }
    in.close();
    }
}
String command[] = {"javac", JAVA_FILE_LOCATION};
ProcessBuilder processBuilder = new ProcessBuilder(command).directory(new File("path/to/dir"));
Process process0 = processBuilder.start();