2010-06-29 45 views
3
import java.lang.*; 
import java.io.*; 

class test 
{ 
    public static void main(String[] a) throws Exception 
    { 
     int i; 
     String[] str = new String[]{"javac","example.java"}; 
     String[] str1 = new String[]{"java","example"}; 
     Runtime r = Runtime.getRuntime(); 
     Process p = null; 
     Process p1 = null; 
     p=r.exec(str); 
     p1=r.exec(str1); 
     InputStreamReader reader = new InputStreamReader (p1.getInputStream()); 
     BufferedReader br = new BufferedReader(reader); 
     FileWriter fw = new FileWriter("this.txt",true); 
     char[] c = new char[1]; 
     while ((i=br.read())!=-1) 
     { 
      c[0]  = (char) i ; 
      fw.write(c); 
      c = new char[1]; 
     } 
     fw.close(); 
    } 
} 

这是一个使用运行时间类的简单程序。 是否需要使用任何终止'进程'代码?此Java代码是否存在编程缺陷?

在此先感谢!

+6

编译它时发生了什么?当你运行它时发生了什么?它是否按预期工作?你是否甚至想要放下你的大小的derrière并试一试? – paxdiablo 2010-06-29 05:44:25

+1

你可以只是fw.write((char)i)并跳过所有与char [] c相关的代码。 – sje397 2010-06-29 05:45:18

+3

@pax,显然工作!=无瑕疵。 – 2010-06-29 05:45:21

回答

4

1。没有理由将过程对象初始化为空。

只要做到:

Process p = r.exec(str); 
Process p1 = r.exec(str1); 

当你在它,更好的变量名,将有助于

2。您可以通过一次读取和写入超过1个字符来提高性能:

3。您可能希望显式指定编码,而不是使用平台默认值。

InputStreamReader reader = new InputStreamReader (p1.getInputStream(), inputCharsetName); 
BufferedReader br = new BufferedReader(reader); 
FileOutputStream fos = new FileOutputStream("this.txt", true); 
Writer writer = new OutputStreamWriter(fos, outputCharsetName); 
+0

谢谢你!我还包括一个终止块! – billu 2010-06-29 06:15:48

3

输入流永远不会关闭,我建议在finally块中关闭写入器。

+0

虽然这是最佳做法,但在这种特殊情况下,除非在同一个JVM中从另一个应用程序调用“主”入口点,否则不会有任何区别。 – 2010-06-29 06:00:11

+2

@Stephen C:最好还是养成将清理代码放入“finally”块的习惯,即使不是严格意义上的必要条件。即使在'main'中放入'finally'块也很少会受到伤害,但是如果你忘记在别的地方执行它,它确实会受到伤害。 – 2010-06-29 06:04:03

+0

事实上,最好理解**为什么**你这样做,当没有必要的时候,那么做一个*理性的*决定去做或不去做。顺便说一句,如果(例如)它是引入NPE错误的工具,一个不必要的'finally'块**可能会有害。 – 2010-06-29 06:28:12

0

是否存在需要使用“进程”代码的任何终止?

我认为这取决于过程 - 它们会自行终止吗? (那你想他们这个程序做的时候终止?)

您可以轻松地终止:

p.destroy(); 
p1.destroy(); 
0

你的程序将无法正常工作的方式,你希望它。即。它会在example.java编译完成之前尝试运行example.class。

+0

它的工作原理和一个文件被创建! – billu 2010-06-29 05:53:55

+0

我认为它是可行的,因为该文件已经存在,请尝试删除类文件并再次运行它。如果它仍然有效:对你有好处,但技术不好,如果课堂需要一些时间来编译它将会失败。 – atamanroman 2010-06-29 06:21:22

+0

文件将被创建。第一个进程没有问题。没有保证p1只会在进程“p”完成后才运行。 – chedine 2010-06-29 06:26:57

1

您应该使用Process.waitFor()为了让编译过程完成。否则,您可能会尝试运行不存在的类文件,因为编译时间过长。

缓冲区太小,每次您执行类似char[] c = new char[1]; // lolz array with exactly one element的操作时,应该至少看两次。

+0

第一句话+1 – sje397 2010-06-29 07:31:44

0

首先,您需要等待编译完成后再执行第二个过程。使用WAITFOR()方法:

int compilationResult = -1; 
try { 
    compilationresult = p.waitFor(); 
} 
catch (InterruptedException ie) { 
    ... 
} 

然后检查compilationResult(中值为0表示成功编译)来确定是否继续与代码的其余部分。其次,如果你在处理完输出后完成了p1过程,那么你应该等待它完成,或者自己杀死它 - 这取决于你是否期望过程自己完成或不完成。

要等待进程正常完成,请使用类似上面的代码块,将p1.waitFor()放在try/catch块中。

要自己杀了它,使用:

p1.destroy(); 

后您确认过程完成后,可能会再希望与p1.exitValue()检查退出值。为什么要这么小心呢?那么,你可能不应该相信你正在收集的输出并写入this.txt,直到你确定该过程正确执行。

相关问题