日期:2014-05-20  浏览次数:20721 次

java程序调用javac编译获取编译结果信息
本帖最后由 feidewu 于 2012-11-17 11:36:26 编辑

                        Process process = null;
Runtime runtime = Runtime.getRuntime();
String str;
String string = null;
int num = 0;
try{
process = runtime.exec("javac "+fileName);
BufferedReader buff = new BufferedReader(new InputStreamReader(process.getInputStream()));
while((str = buff.readLine()) != null)
{
string += str;
}
errortextArea.setText(string+"hello");
}
catch(Exception e1){
e1.printStackTrace();
}

我在做一个简单的java编译器,调用javac编译求的出错信息。
代码如上,fileName是文件路径名,得到的string为null,为什么没有得到编译出错的信息?
------最佳解决方案--------------------
引用:
上一个回复我没说清楚,在我的程序的界面中读进一个java文件后调用javac编译得到的编译结果是:找不到或无法加载主类 MyEditor2.java

因为你的路径不一样,
给你举个例子,
比如我现在的路径是
eclispse
  ->bin
  ->src
      ->Compiler.java
      ->Target.java
你使用的是Compiler来执行exec编译Target.java的话
要这样写
runtime.exec("javac src/Target.java");
------其他解决方案--------------------
你都知道是出错了,还用getInputStream,你说能获得信息吗?
请用getErrorStream
------其他解决方案--------------------
java创建子进程执行并获取其标准输出流,用Runtime类来搞功能还是太弱了,建议你还是用native方法实现,暴露JNI接口给java调用,就是会变的不跨平台了
------其他解决方案--------------------
从java6开始提供了javax.tools.JavaCompiler,为什么还使用Runtime调用javac
------其他解决方案--------------------
使用StringBuilder
StringBuilder builder = new StringBuilder(1024);
循环里
builder.append(str);
------其他解决方案--------------------
+= 连接字符串相对比较耗时
------其他解决方案--------------------
同意楼上的,编译,执行需要加上包名
------其他解决方案--------------------
怎么没人回复呢?会追加分数的。
------其他解决方案--------------------
string没有被初始化,直接调用:string+=str,不报空指针
------其他解决方案--------------------
引用:
string没有被初始化,直接调用:string+=str,不报空指针?

我把str初始化null后,还是没办法出现出错信息,string还是null
------其他解决方案--------------------
引用:
从java6开始提供了javax.tools.JavaCompiler,为什么还使用Runtime调用javac

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, filename);
compiler.run这句根本不执行。为什么?我是从硬盘中打开某个java文件然后进行编译的
------其他解决方案--------------------
使用getErrorStream    
------其他解决方案--------------------
引用:
你都知道是出错了,还用getInputStream,你说能获得信息吗?
请用getErrorStream


String str = "";