Запись данных в InputStream программы grep, вызываемой в Java - PullRequest
0 голосов
/ 05 марта 2010

Я пытаюсь обработать данные, полученные из прогона diff, в экземпляр GNU grep в java-программе. Мне удалось получить выходные данные diff с помощью outputStream объекта Process, но в настоящее время у меня есть программы, отправляющие эти данные на стандартный ввод grep (через другой объект Process, созданный в Java). Запуск Grep со входом возвращает только код состояния 1. Что я делаю не так?

Ниже приведен код, который у меня есть:

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 Ответ

1 голос
/ 05 марта 2010

Всего лишь пара подсказок, вы могли бы:

  • передать вывод diff непосредственно в grep: diff -n leftpath rightPath | grep "^a"
  • читать выходной файл из grep вместо stdin: grep "^a" tmpFile
  • используйте ProcessBuilder, чтобы получить Process, где вы можете легко избежать процесса блокировки, потому что вы не читаете stderr, используя redirectErrorStream
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...