如何在Java中编译和运行.java文件?

时间:2015-02-22 04:25:49

标签: java

我尝试了这个,但它没有奏效。 我的启动命令提示符命令的方法:

public static void executeCommand(String command, String path){
  File folder = new File(path);
  ProcessBuilder pb = new ProcessBuilder(command);
  pb.directory(folder.getAbsoluteFile()); 
  pb.redirectErrorStream(true);
  try{
    pb.start();
  }catch (IOException e){
    e.printStackTrace();
  }
}  

`

以及调用方法的代码:

executeCommand("javac "+str+".java", path);
executeCommand("java "+str, path);

但是它抛出了IOException。我想知道这是否是错误的做法以及如何解决它。 " STR"是.java文件。路径是运行它的文件夹的路径。

3 个答案:

答案 0 :(得分:1)

在Java中实际上有一种标准的方法 - 使用JavaCompiler类。但是,您的类路径中可以使用require that tools.jar

该页面上的文档只是可以帮助您入门,但为了完整起见,这是一个示例。

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, Locale.US, Charset.defaultCharset());
File[] files = new File[]{new File("/path/to/java/source/file/you/want/to/compile")};
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();

Iterable<? extends JavaFileObject> compilationUnits1 =
        fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files));
Boolean call = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits1).call();
for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
    System.out.println(diagnostic);

}

System.out.println("compiled successfully: " + call);

如果您要编译整个目录的内容,那么您可能需要稍微更改一下数组:

File directory = new File("/path/to/directory");
File[] files = directory.listFiles();

答案 1 :(得分:0)

您需要说明javac和Java的位置,您传入的目录是文件的目录,而不是您要运行的进程的二进制文件的目录。完全限定javac / java或将目录设置为可执行文件的位置

答案 2 :(得分:0)

您正在获取IOException

  

java.io.IOException:无法运行程序“javac”:

您需要将参数分隔为单独的字符串,如下所示:

executeCommand(new String[]{"javac",str+".java"},path);
                              /\   
                              ||
                   Please notice No Space like this "javac "
                                                          ^^
                                                       Remove(Space)

同样在executeCommand方法中更改参数列表,如下所示:

public static void executeCommand(String [] command, String path)

"javac"删除空格后,我刚刚尝试过并成功执行了程序。


执行命令的Alternatice方法

您可以使用Runtime#exec()方法

public static void executeCommand(String command){
   try{
        Process process = Runtime.getRuntime().exec(command);
        InputStream error = process.getErrorStream();
        InputStreamReader isrerror = new InputStreamReader(error);
        BufferedReader br = new BufferedReader(isrerror);
        String line=null;
        while ((line = bre.readLine()) != null) {
          System.out.println(line);
        }
        process.waitFor();
      }catch (Exception e){
       e.printStackTrace();
     }
}

打电话给他们

executeCommand("javac "+str+".java");
executeCommand("java "+str);

我已经使用ErrorStream检查我正在编译的.java文件中是否存在编译时错误