[英]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
影響。
要從其他目錄執行程序,請使用ProcessBuilder
的directory(...)
方法:
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.