2010-03-05 71 views
0

我試圖在java程序中處理從diff的運行得到的數據到GNU grep的一個實例。我設法使用Process對象的outputStream獲取diff的輸出,但是我目前正在將程序發送給grep的標準輸入(通過另一個用Java創建的Process對象)。使用輸入運行Grep只會返回狀態碼1.我做錯了什麼?將數據寫入java中調用的grep程序的InputStream中

下面是我到目前爲止的代碼:要比較

public class TestDiff { 
final static String diffpath = "/usr/bin/"; 

public static void diffFiles(File leftFile, File rightFile) { 

    Runtime runtime = Runtime.getRuntime(); 

    File tmp = File.createTempFile("dnc_uemo_", null); 

    String leftPath = leftFile.getCanonicalPath(); 
    String rightPath = rightFile.getCanonicalPath(); 

    Process proc = runtime.exec(diffpath+"diff -n "+leftPath+" "+rightPath, null); 
    InputStream inStream = proc.getInputStream(); 
    try { 
     proc.waitFor(); 
    } catch (InterruptedException ex) { 

    } 

    byte[] buf = new byte[256]; 

    OutputStream tmpOutStream = new FileOutputStream(tmp); 

    int numbytes = 0; 
    while ((numbytes = inStream.read(buf, 0, 256)) != -1) { 
     tmpOutStream.write(buf, 0, numbytes); 
    } 

    String tmps = new String(buf,"US-ASCII"); 

    inStream.close(); 
    tmpOutStream.close(); 

    FileInputStream tmpInputStream = new FileInputStream(tmp); 

    Process addProc = runtime.exec(diffpath+"grep \"^a\" -", null); 
    OutputStream addProcOutStream = addProc.getOutputStream(); 

    numbytes = 0; 
    while ((numbytes = tmpInputStream.read(buf, 0, 256)) != -1) { 
     addProcOutStream.write(buf, 0, numbytes); 
     addProcOutStream.flush(); 
    } 
    tmpInputStream.close(); 
    addProcOutStream.close(); 

    try { 
     addProc.waitFor(); 
    } catch (InterruptedException ex) { 

    } 

    int exitcode = addProc.exitValue(); 
    System.out.println(exitcode); 

    inStream = addProc.getInputStream(); 
    InputStreamReader sr = new InputStreamReader(inStream); 
    BufferedReader br = new BufferedReader(sr); 

    String line = null; 
    int numInsertions = 0; 
    while ((line = br.readLine()) != null) { 

     String[] p = line.split(" "); 
     numInsertions += Integer.parseInt(p[1]); 

    } 
    br.close(); 
} 
} 

兩個leftPath和rightPath是指向文件的File對象。

回答

1

只是一對夫婦的提示,你可以:

  • 管diff的輸出,直接進入的grep:diff -n leftpath rightPath | grep "^a"
  • 從grep的,而不是標準輸入讀取輸出文件:grep "^a" tmpFile
  • 使用ProcessBuilder得到您的Process您可以輕鬆避免阻止過程,因爲您沒有通過使用redirectErrorStream
相關問題