2010-09-20 15 views
10

"Newsworthy_RB" adlı başka bir java programını yürüten java kodunu aşağıda yazdım.Hem out.println() hem de err.println() ifadelerini yazdırmak için bir java programı nasıl oluşturulur?

Newsworthy_RB.java hem System.out.printlln() hem de System.err.println() ifadelerini içerir.

Her iki çıkışın da komut istemi konsolunda yazdırılmasını istiyorum.

Aynı şeyi elde etmek için yapılması gerekenler.

Aşağıdaki program sadece err.println() ifadelerini değil out.println() ifadelerini yazdırır.

Lütfen aşağıdaki kodun beklediğim gibi çalışıp çalışmayacağını bana bildirin.

command = "java -cp .:../sqljdbc.jar SetHash Newsworthy_RB"; 
Process child1 = Runtime.getRuntime().exec(command); 
InputStream in1 = child1.getErrorStream(); 
InputStream in2 = child2.getInputStream(); 
while ((c = in1.read()) != -1 || (c = in2.read()) != -1) { 
     System.out.print((char)c); 
    } 

cevap

14

Her şeyden önce, dış programların başlatılmasının tercih edilen yolu ProcessBuilder'dir. Hatta the docs for Runtime ifade edilir:

ProcessBuilder.start() şimdi bir tadil edilmiş çevre ile bir işlemi başlatmak için tercih edilen bir yöntemdir. ProcessBuilder yılında

Eğer çok uygun bir yöntemdir redirectErrorStream denilen vardır:

Setleri bu süreç üreticisinin redirectErrorStream özelliği.

bu özelliği true olursa, o zaman sonradan bu nesnenin başından tarafından başlatılmış subprocesses tarafından oluşturulan hata çıkışı() hem Process.getInputStream (kullanılarak okunabilir böylece yöntem, standart çıkışa ile birleştirilecektir) yöntem. Bu, hata mesajlarını karşılık gelen çıktıyla ilişkilendirmeyi kolaylaştırır. Başlangıç ​​değeri yanlıştır.

tam bir örneği nasıl çıktı hem standart hata ve standart dışarı:

import java.io.*; 

public class Test { 
    public static void main(String... args) throws IOException { 

     ProcessBuilder pb = 
       new ProcessBuilder("java", "-cp", "yourClassPath", "HelloWorld"); 

     pb.redirectErrorStream(true); 
     Process proc = pb.start(); 

     Reader reader = new InputStreamReader(proc.getInputStream()); 
     int ch; 
     while ((ch = reader.read()) != -1) 
      System.out.print((char) ch); 
     reader.close(); 
    } 
} 

Tepki Güncellemenize: Hayır, kod ile

while ((c = in1.read()) != -1 || (c = in2.read()) != -1) 

olmaz çalışma, read() bir engelleme yöntemidir ve sadece bir iş parçacığınız vardır. Tek seçeneğiniz, giriş akışı başına bir iş parçacığı kullanmak veya (tercihli olarak) iki giriş akışını ProcessBuilder.redirectErrorStream kullanarak bir araya getirmektir.

+0

Sadece açıklama türünü seviyorum. Cevabınız için çok teşekkürler. Ama şimdilik, sorumu içinde yaptığım değişikliklerin işe yarayıp yaramadığını bana bildirin. – LGAP

+0

Ben kesinlikle ProcessBuilder kavramlarını gelecekteki prosedürlerimde uygulayacağım. – LGAP

+0

Ayrıca bana bildirin: ProcessBuilder pb = yeni ProcessBuilder ("java", "HelloWorld"); 'Bu ifadedeki programın sınıf yolundan nasıl bahsedilir? – LGAP

10

Her iki akışın çıkışını ayrı bir iş parçacığına almanız gerekir. here Örnek kodu: getErrorStream ve getInputStream:

Process p = Runtime.getRuntime().exec(cmd.array()); 
copyInThread(p.getInputStream(), System.out); 
copyInThread(p.getErrorStream(), System.err); 
p.waitFor(); 
return p.exitValue(); 

private void copyInThread(final InputStream in, final OutputStream out) { 
    new Thread() { 
     public void run() { 
      try { 
       while (true) { 
        int x = in.read(); 
        if (x < 0) { 
         return; 
        } 
        if (out != null) { 
         out.write(x); 
        } 
       } 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } .start(); 
} 
+0

Cevabınız için teşekkür ederiz Mueller. Sorumu güncelledim.Lütfen bu işe yarayacak mı bilmeyecek misin? – LGAP

+3

"Çalışma Zamanı" belgelerinden: "ProcessBuilder.start() şimdi değiştirilmiş bir ortamla bir işlem başlatmanın tercih edilen yoludur." ProcessBuilder.redirectErrorStream' kullanmanızı öneririm. (Cevabımıma bakın.) – aioobe

+0

@aioobe: Haklısınız! ProcessBuilder hakkında bir şey bilmiyordum. –

1

işlem nesnesi iki yöntem bulunmaktadır. Şu anda, programınız sadece birini dinliyor. İkisini de dinlemesini isteyeceksiniz.

İlgili konular