如何获取java程序的输出?

我需要编写一个代码来帮助我获得程序的输出。

我在那个正在编译的Java文件MainClass.java中,有一个打印"OK"的简单代码。

我怎么能返回这个输出,即使有错误,我也需要把它拿走。

这是我编译和创建.class文件的代码。

 File sourceFile = new File("C:\\Projet_Interne\\webProject\\NewFolder\\MainClass.java"); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); int compilationResult = compiler.run(null, null, null,sourceFile.getPath()); int result = compiler.run(System.in,System.out,System.err,sourceFile.getPath()); System.out.println("Compile result code = " + result); if(compilationResult == 0){ System.out.println("Compilation is successful"); }else{ System.out.println("Compilation Failed"); } StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, Locale.getDefault(), null); stdFileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File("C:\\Projet_Interne\\webProject\\NewFolder"))); 

您可以使用DiagnosticCollector ,它允许您收集有关编译过程的诊断信息,您可以从JavaDocs中找到更多详细信息

例如…

 File helloWorldJava = new File(...); DiagnosticCollector diagnostics = new DiagnosticCollector(); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null); // This sets up the class path that the compiler will use. // I've added the .jar file that contains the DoStuff interface within in it... List optionList = new ArrayList(); optionList.add("-classpath"); optionList.add(System.getProperty("java.class.path")); Iterable compilationUnit = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(helloWorldJava)); JavaCompiler.CompilationTask task = compiler.getTask( null, fileManager, diagnostics, optionList, null, compilationUnit); if (task.call()) { System.out.println("Yipe"); } else { // Opps compile failed... for (Diagnostic diagnostic : diagnostics.getDiagnostics()) { System.out.format("Error on line %d in %s%n", diagnostic.getLineNumber(), diagnostic.getSource().toUri()); } } fileManager.close(); 

编译完成后,你有两个选择,你可以使用自定义类加载器来加载类并执行它,这将使用你当前的标准输出…

 // Create a new custom class loader, pointing to the directory that contains the compiled // classes, this should point to the top of the package structure! URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("./").toURI().toURL()}); // Load the class from the classloader by name.... Class loadedClass = classLoader.loadClass("testcompile.HelloWorld"); // Create a new instance... Object obj = loadedClass.newInstance(); // Santity check if (obj instanceof DoStuff) { // Cast to the DoStuff interface DoStuff stuffToDo = (DoStuff)obj; // Run it baby stuffToDo.doStuff(); } 

或者使用ProcessBuilder执行另一个Java进程……

 ProcessBuilder pb = new ProcessBuilder("java", "HelloWorld"); pb.directory(new File("src")); pb.redirectError(); Process p = pb.start(); InputStreamConsumer.consume(p.getInputStream()); p.waitFor(); 

作为参考, InputStreamConsumer ….

 public static class InputStreamConsumer implements Runnable { private InputStream is; public InputStreamConsumer(InputStream is) { this.is = is; } public InputStream getInputStream() { return is; } public static void consume(InputStream is) { InputStreamConsumer consumer = new InputStreamConsumer(is); Thread t = new Thread(consumer); t.start(); } @Override public void run() { InputStream is = getInputStream(); int in = -1; try { while ((in = is.read()) != -1) { System.out.print((char)in); } } catch (IOException exp) { exp.printStackTrace(); } } } 

这在以下内容中有更详细的概述:

  • 如何动态编译和加载外部java类?
  • 如何在java程序中编译和运行

run方法可以使用流来处理输入和输出:

 int run(InputStream in, OutputStream out, OutputStream err, String... arguments) 

使用OutputStream out并在run完成后从中读取。