使用 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)
有谁知道我做错了什么?如果需要,我也可以 post 整个代码,但我认为它与这里无关。
更新:添加了我的代码
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
) 放在一个变量中,
而不是在多个地方对其进行硬编码。
这样修改起来会更容易,不需要在多个地方编辑。
我 运行遇到了一个讨厌的小错误,我不确定如何解决它。我要做的事情非常简单:运行 使用 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)
有谁知道我做错了什么?如果需要,我也可以 post 整个代码,但我认为它与这里无关。
更新:添加了我的代码
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
) 放在一个变量中,
而不是在多个地方对其进行硬编码。
这样修改起来会更容易,不需要在多个地方编辑。