2016-11-17 34 views
7

ile okuma yaparken eksik satır Çıktının altına yazdırılan bir örnek EXE var.Giriş akışı okuyucusu

EXE'leri Çıktı: java

1 
2 
3 
4 
5 
Failed 

eşdeğer kod:

for (int i = 1; i <= 5; i++){ 
    System.out.println(i); 
} 
System.out.println("Failed"); 

java kodu kullanarak EXE başlatmak ve bazı veriler kaybolursa çıkışı okumaya çalışıyorum.

Öğeyi başlatmak için java'yı bulun.

Java Kodu:

String[] commands = new String[] {"sample.exe" }; 
p = Runtime.getRuntime().exec(commands); 
InputStream is = p.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 
while ((line = br.readLine()) != null) { 
    line = br.readLine() 
    System.out.println(line); 
    if(line.toLowerCase().contains("failed")){ 
      #Apply business Rule. 
    } 
} 

Çıktı: biz 2,3,5,failed gibi eksik veri olduğu açıktır çıktı Yukarıdan

1 
3 
5 

.

Öğenin, InputStreamReader numaralı telefonu kullanarak okumadan önce tamamlandığını düşünüyorum. Öğeyi InputStreamReader kullanarak okuyana kadar beklemenin bir yolu var mı ve bir sonraki yönerge setine başla ya da bunu yapmanın başka bir yolu daha var.

Edit1: benim orijinal kodunda

Ben de kod bulabilirsiniz paralel olarak hata akımını okuyorum.

ErrorStreamReader:

public void run() { 
    try { 

     InputStreamReader isr = new InputStreamReader (is); 
     BufferedReader br = new BufferedReader (isr); 
     while (true) { 
       String s = br.readLine(); 
       System.out.println(s+"error Stream"); 
       if (s == null) break; 
      } 

    is.close();  
    } catch (Exception ex) { 
     System.out.println ("Problem reading stream " + name + "... :" + ex); 
     ex.printStackTrace(); 
    } 
} 

EXE yürütücüsü Java kodu: Bu okuyucu her seferinde bir satır atlayarak okuma giriş akışı benzeyen

String[] commands = new String[] {"sample.exe" }; 
p = Runtime.getRuntime().exec(commands); 
Thread errorStream = new Thread(new ReadStream("stderr", 
    p.getErrorStream()) # Reads error Stream In parallel 
InputStream is = p.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 
while ((line = br.readLine()) != null) { 
    line = br.readLine() 
    System.out.println(line); 
    if(line.toLowerCase().contains("failed")){ 
      #Apply business Rule. 
    } 
} 

.

EDIT2: InputStreamReader Ben 6 için 1 yazdırmak için EXE (bir piton script) bir değişiklik yapılmış ve daha sonra başarısız çift sayı hatları eksikti düşüncesi içinde olduğundan

. Ben tek sayılı satırları eksik düşünce gibi

1 
3 
5 
Failed 

:

Modifiye EXE Çıktı:

1 
2 
3 
4 
5 
6 
Failed 

Şimdi InputStreamReader çıkışı

Java Çıktı oldu.Birisi bana nedenini bildirir misiniz?


Not:

sorun rahatsızlıktan dolayı iki kez özür InputStream okuma kaynaklanıyordu. Çok üzgünüm.

+3

yanlış yöne bakıyormuş gibi görünüyorsunuz .. kod iyi görünüyor ve anlattığınız şey için çalışmalı. sample.exe bu şekilde dönecekti .. ne görüyorsun. – mtk

+0

Bu exe dosyanız sadece 1 ve 4 baskıları gibi görünüyor. – f1sh

+0

Bu yararlı olabilir http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html? sayfa = 2 – stacker

cevap

4

sorun nedeniyle iki kez Dolayısıyla

while ((line = br.readLine()) != null) { 
    line = br.readLine() # input stream read here twice 
    System.out.println(line); 
    if(line.toLowerCase().contains("failed")){ 
      #Apply business Rule. 
    } 
} 

sorun InputStream okuma etmekti. Çözmek için sadece bir kere inputStream okuyordum.