簡體   English   中英

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

[英]Running shell commands within .java file using ProcessBuilder

我遇到了一個討厭的小錯誤,不確定如何解決。 我想做的事情很簡單:使用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)

有人知道我在做什么錯嗎? 另外,如果需要的話,我可以發布整個代碼,但是我發現這里並沒有太大的意義。

更新:添加了我的代碼

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();
    }
}

您使用第一個ProcessBuilder執行的cd命令僅影響該子進程 ,它不會更改主執行程序的工作目錄。 當您運行第二個ProcessBuilder ,它將把工作目錄作為主程序,而完全不受先前ProcessBuilder執行的cd影響。

要從其他目錄執行程序,請使用ProcessBuilderdirectory(...)方法:

String command[] = {"javac", JAVA_FILE_LOCATION};
ProcessBuilder processBuilder = new ProcessBuilder(command).directory(new File("path/to/dir"));
Process process0 = processBuilder.start();

順便說一句,路徑“ /Users/Desktop/piano.java”看起來很奇怪。 在Mac上,用戶桌面的路徑通常是/Users/username/Desktop ,因此代碼中的路徑表示您的用戶名是“ Desktop”,這是非常不尋常的。

並且,為使使用該程序更容易,我建議將基本目錄路徑( /Users/username/Desktop )放在變量中,而不是在多個位置進行硬編碼。 這樣一來,更改變得更加容易,無需在多個位置進行編輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM