2013-03-05 36 views
7

Basit bir java programı üzerinde çalışıyorum. Başka bir java programını derler ve çalıştırır. Derlemek ve çalıştırmak için Runtime.exec() işlevini kullanıyorum. Derleme ile ilgili bir sorun yok. ama ne zaman çalışırsa, ikinci programın klavyeden okunacak bir girişi olması gerekiyorsa, bunu ana işlemden sağlayamıyorum. GetOutputStream() işlevini kullandım. ama yardım edemedi. Kodumu vereceğim.Başka bir java programından bir java programı çalıştırma

public class sam { 
    public static void main(String[] args) throws Exception { 
     try { 
      Process p = Runtime.getRuntime().exec("javac sam2.java"); 
      Process p2 = Runtime.getRuntime().exec("java sam2"); 
      BufferedReader in = new BufferedReader( 
           new InputStreamReader(p2.getInputStream())); 

      OutputStream out = p.getOutputStream(); 
      String line = null; 
      line = in.readLine(); 
      System.out.println(line); 
      input=input+"\n"; 
      out.write(input.getBytes()); 
      p.wait(10000); 
      out.flush(); 
     }catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Bu benim ana programım (sam.java). Aşağıdaki

benim ikinci program sadece baskı ifadeleri varsa hiçbir sorun yoktur sam2.java

public class sam2 { 
public static void main(String[] args) throws Exception { 

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String str; 
    System.out.println("Enter the number..\n"); 
    str = br.readLine(); 
    System.out.println(Integer.parseInt(str)); 

    } 
} 

ait kodudur. Ama sorun, diğerinden bir şey okumak zorunda kaldığımda ortaya çıkıyor.

+0

sam'ın STDIN'den sam2'ye bir çeşit boru yapmak zorunda kalacaksınız, ama bu onun değerinin daha fazla sıkıntısı çekebilir. –

+0

Lütfen java adlandırma kurallarını öğrenip onlara yapıştırın, burada: sınıf adları büyük harfle başlamalıdır. – kleopatra

+0

Basit bir örnek sunmaya çalışıyordum. tavsiyeniz için teşekkürler .. :) – BBHeeMAA

cevap

18

Bu biraz garip ama ikinci programı onu kullanmadan çalıştırabilirsiniz. Sadece ana yöntemi çağırıyor. Yani çalışma zamanı bölümünü unutmak ve bunu yapmak: Elbette

sam2.main(new String[0]); 

Eğer sadece ikinci sınıfın ana yöntemini çağırabilirsiniz derleme zamanında

+0

Bu ifadeyle ne demek istediğini anlayamadım .. !! :( – BBHeeMAA

+1

Çalışıyor .. :) çok teşekkürler .. Ama bu yolu kullandığımda .. tüm kontrol ikinci programa gitmiş olacak. böylece master sadece ikinci programın tamamlanmasından sonra yürütülür .. bu sorunu çözmek için thread kullanmalıyım .. ?? – BBHeeMAA

+0

Elbette yapmalısın. –

1

de SAM2 derlemek gerekir bu şekilde. Ana yöntem diğer herhangi bir statik yöntem gibidir.

9

Her işlemin çalışmasına ve sonlandırılmasına izin verilmelidir. Bu amaç için Process#waitFor'u kullanabilirsiniz. Aynı şekilde, süreçten çıktıları aynı anda tüketmeniz gerekir. waitFor bloğu engelleyecek ve böylece girişi okumak için bir Thread kullanmanız gerekecektir (ve gerekirse işleme yazmanız gerekiyorsa)

Java/sınıf dosyasının konumuna bağlı olarak, bir başlangıç ​​belirtmeniz gerekebilir. işlemin yürütülmesinin başlayabileceği klasör.

Şimdi açıkçası ProcessBuilder

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 

public class CompileAndRun { 

    public static void main(String[] args) { 
     new CompileAndRun(); 
    } 

    public CompileAndRun() { 
     try { 
      int result = compile("compileandrun/HelloWorld.java"); 
      System.out.println("javac returned " + result); 
      result = run("compileandrun.HelloWorld"); 
     } catch (IOException | InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public int run(String clazz) throws IOException, InterruptedException {   
     ProcessBuilder pb = new ProcessBuilder("java", clazz); 
     pb.redirectError(); 
     pb.directory(new File("src")); 
     Process p = pb.start(); 
     InputStreamConsumer consumer = new InputStreamConsumer(p.getInputStream()); 
     consumer.start(); 

     int result = p.waitFor(); 

     consumer.join(); 

     System.out.println(consumer.getOutput()); 

     return result; 
    } 

    public int compile(String file) throws IOException, InterruptedException {   
     ProcessBuilder pb = new ProcessBuilder("javac", file); 
     pb.redirectError(); 
     pb.directory(new File("src")); 
     Process p = pb.start(); 
     InputStreamConsumer consumer = new InputStreamConsumer(p.getInputStream()); 
     consumer.start(); 

     int result = p.waitFor(); 

     consumer.join(); 

     System.out.println(consumer.getOutput()); 

     return result;   
    } 

    public class InputStreamConsumer extends Thread { 

     private InputStream is; 
     private IOException exp; 
     private StringBuilder output; 

     public InputStreamConsumer(InputStream is) { 
      this.is = is; 
     } 

     @Override 
     public void run() { 
      int in = -1; 
      output = new StringBuilder(64); 
      try { 
       while ((in = is.read()) != -1) { 
        output.append((char) in); 
       } 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
       exp = ex; 
      } 
     } 

     public StringBuilder getOutput() { 
      return output; 
     } 

     public IOException getException() { 
      return exp; 
     } 
    } 
} 

kullanarak bu çoğu önemli ölçüde kolaylaştırmak için, süreçlerin dönüş sonuçlarını kontrol etmelidir ve süreçler ile etkileşim için daha iyi bir mekanizma üretmek olabilir, ama bu temel fikir. ..

İlgili konular