2010-06-29 6 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

컴파일하면 어떻게됩니까? 네가 그것을 달렸을 때 무슨 일이 일어난거야? 예상대로 작동 했습니까? 당신은 당신의 꽤 큰 데 드리에에서 떨어져서 시도해 보셨나요? – paxdiablo

+1

fw.write ((char) i)와 char [] c와 관련된 모든 코드를 건너 뛸 수 있습니다. – sje397

+3

@pax, 분명히 작동합니다! = 결함이 없습니다. –

답변

4

1. 프로세스 객체를 null로 초기화 할 이유가 없습니다.

그냥 할 : 당신이 그것에 인 동안, 더 나은 변수 이름은

이 도움이 될

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

. 한 번에 한 글자 이상 읽고 쓰는 것으로 성능을 향상시킬 수 있습니다 :

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

감사합니다! 그리고 나는 또한 finally 블록을 포함했다! – billu

3

입력 스트림은 절대로 닫히지 않으며, finally 블록에서 작성기를 닫는 것이 좋습니다.

+0

이 작업을 수행하는 것이 "우수 사례"이지만,이 특별한 경우에는 "JVM"진입 점이 동일한 JVM의 다른 응용 프로그램에서 호출되는 경우를 제외하고는 차이가 없습니다. –

+2

@Stephen C : 엄밀히 말하면 필요하지 않은 곳에서도 정리 코드를 'finally'블록에 넣는 습관을 갖는 것이 가장 좋습니다. 'main' 에서조차'finally' 블록을 넣는 것은 거의 드물지 만 여러분이 다른 곳에서 그것을하는 것을 잊어 버리면 상처를줍니다. –

+0

사실, ** 이것이 ** 불필요 할 때 이것을하는 이유를 이해하는 것이 가장 좋습니다. 그런 다음 합리적인 결정을 내리거나하지 마십시오. 그런데 불필요한'finally' 블록 **은 (예를 들어) NPE 버그를 도입하는 수단 인 경우 유해 할 수 있습니다. –

0

'프로세스'코드의 종료가 필요합니까?

나는 프로세스에 달려 있다고 생각합니다. 당신이에 기대하는 것처럼

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

여러분의 프로그램은 방법을 작동하지 않습니다

당신은 쉽게 종료 할 수 있습니다 (? 그리고 당신은이 프로그램이하는 때 그들을 종료 싶어). 즉. example.java의 컴파일이 완료되기 전에 example.class를 실행하려고 시도합니다.

+0

그것이 작동하고 파일이 만들어집니다 !! – billu

+0

파일이 이미 있기 때문에 작동한다고 말하면 클래스 파일을 삭제하고 다시 실행하십시오. 그래도 작동한다면 : 좋지만 나쁜 기술입니다. 클래스를 컴파일하는 데 시간이 걸리면 실패합니다. – atamanroman

+0

파일이 생성됩니다. 첫 번째 프로세스에는 문제가 없습니다. 프로세스 'p'가 완료된 후에 만 ​​p1이 실행될 것이라는 보장은 없습니다. – chedine

1

컴파일 프로세스를 완료하려면 Process.waitFor()를 사용해야합니다. 그렇지 않으면 컴파일에 시간이 너무 오래 걸리기 때문에 존재하지 않는 클래스 파일을 실행하려고 할 가능성이 큽니다.

버퍼가 너무 작습니다. char[] c = new char[1]; // lolz array with exactly one element과 같은 작업을 할 때마다 적어도 두 번보아야합니다.

+0

+1 첫 문장 – sje397

0

먼저 두 번째 프로세스를 실행하기 전에 컴파일이 완료 될 때까지 기다려야합니다. WAITFOR() 메소드를 사용하여

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

그런 다음 코드의 나머지 부분을 계속할지 여부를 결정 compilationResult (0의 값이 성공적으로 컴파일을 표시)를 확인.

두 번째로, 출력 처리 후 p1 프로세스가 완료되면 프로세스가 완료 될 것으로 기대되는지 여부에 따라 프로세스가 완료 될 때까지 기다리거나 직접 종료해야합니다.

프로세스가 정상적으로 완료 될 때까지 기다리려면 try/catch 블록에 p1.waitFor()을 입력하여 위와 유사한 코드 블록을 사용하십시오.

자신을 죽일하려면 사용

이 과정이 완료 확실 후
p1.destroy(); 

, 당신은 다음 p1.exitValue()과 종료 값을 확인 할 수 있습니다. 왜 이것에 대해 조심해야할까요? 처리가 올바르게 실행될 때까지는 수집하고 쓰는 출력을 this.txt으로 신뢰하면 안됩니다.

관련 문제