Есть ли программные дефекты в этом Java-коде? - PullRequest
3 голосов
/ 29 июня 2010
    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();
    }
}

это простая программа, использующая класс времени выполнения. есть ли необходимость в завершении кода «процесса»?

Заранее спасибо !!!

Ответы [ 6 ]

4 голосов
/ 29 июня 2010

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);
3 голосов
/ 29 июня 2010

Входной поток никогда не закрывается, и я рекомендую закрыть средство записи в блоке finally.

1 голос
/ 29 июня 2010

Вы должны использовать Process.waitFor (), чтобы завершить процесс компиляции.В противном случае вы, вероятно, попытаетесь запустить несуществующий файл класса, потому что компиляция заняла слишком много времени.

Буфер слишком мал, каждый раз, когда вы делаете что-то вроде char[] c = new char[1]; // lolz array with exactly one element, вы должны выглядеть как минимум дважды.

0 голосов
/ 29 июня 2010

Во-первых, вам нужно дождаться завершения компиляции, прежде чем выполнять второй процесс. Используйте метод waitFor ():

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

Затем проверьте compilationResult (значение 0 указывает на успешную компиляцию), чтобы определить, следует ли продолжить с остальной частью кода.

Во-вторых, если вы закончили с процессом p1 после обработки его вывода, то вам следует либо дождаться его завершения, либо завершить его самостоятельно - в зависимости от того, ожидаете ли вы, что процесс завершится сам по себе.

Чтобы дождаться нормального завершения процесса, используйте блок кода, аналогичный приведенному выше, заключив p1.waitFor() в блок try / catch.

Чтобы убить его самостоятельно, используйте:

p1.destroy();

После того, как вы убедитесь, что процесс завершен, вы можете проверить значение выхода с помощью p1.exitValue(). Зачем быть таким осторожным? Что ж, вам, вероятно, не стоит доверять выводу, который вы собираете и записываете в this.txt, пока не убедитесь, что процесс выполнен правильно.

0 голосов
/ 29 июня 2010

Ваша программа не будет работать так, как вы ожидаете. то есть. он попытается запустить example.class до того, как будет завершена даже компиляция example.java.

0 голосов
/ 29 июня 2010

есть ли какое-либо завершение кода процесса?

Я думаю, что это зависит от процессов - будут ли они завершаться самостоятельно?(И вы хотите, чтобы они прекращали работу, когда эта программа?)

Вы можете легко завершить с помощью:

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