(Java) Перенаправление файлов (в обе стороны) в Runtime.exec? - PullRequest
2 голосов
/ 23 июля 2011

Я хочу выполнить эту команду:

/ceplinux_work3/myName/opt/myCompany/ourProduct/bin/EXECUTE_THIS -p cepamd64linux.myCompany.com:19021/ws1/project_name < /ceplinux_work3/myName/stressting/Publisher/uploadable/00000.bin >> /ceplinux_work3/myName/stressting/Publisher/stats/ws1.project_name.19021/2011-07-22T12-45-20_PID-2237/out.up

Но она не работает, потому что EXECUTE_THIS требует входной файл через перенаправление, и простая передача этой команды в Runtime.exec не работает.

Примечание: я обыскал все, как решить эту проблему, прежде чем приехать сюда, чтобы спросить.В Интернете есть много вопросов / статей, касающихся Runtime.exec и перенаправления ввода / вывода.Тем не менее, я не могу найти ничего, что связано с передачей файла команде и выводом результата в другой файл.Кроме того, я совершенно незнаком с потоками ввода / вывода, поэтому мне сложно собрать всю информацию для моей конкретной ситуации.

Тем не менее, любая помощь очень ценится.

PS Если есть несколько способов сделать это, я предпочитаю то, что является самым быстрым с точки зрения пропускной способности.

Редактировать: Как обсуждалось в моем последнем вопросе, я НЕ МОГУ изменить это на вызов bash, потому что программа должна ждатьэтот процесс закончить, прежде чем продолжить.

1 Ответ

2 голосов
/ 23 июля 2011

Если вы не отправляете файл имя на стандартный ввод процесса, нет никакого различия в том, были ли данные получены из файла или из любого другого источника данных.

Вынеобходимо написать OutputStream, заданное Process.getOutputStream().Данные, которые вы записываете в него, вы можете прочитать в из файла, используя FileInputStream.

Объединение этого может выглядеть примерно так:

    Process proc = Runtime.getRuntime().exec("...");

    OutputStream standardInputOfChildProcess = proc.getOutputStream();
    InputStream dataFromFile = new FileInputStream("theFileWithTheData.dat");

    byte[] buff = new byte[1024];
    for ( int count = -1; (count = dataFromFile.read(buff)) != -1; ) {
        standardInputOfChildProcess.write(buff, 0, count);
    }

Iупустил много деталей, это просто чтобы понять суть.Вы захотите безопасно закрыть вещи, возможно, захотите рассмотреть буферизацию, и вам нужно беспокоиться о ловушках Runtime.exec().

Редактировать

Записать вывод вфайл похож.Получите FileOutputStream, указывающий на выходной файл, и запишите данные, которые вы прочитали из Process.getInputStream(), в этот OutputStream.Главное предостережение заключается в том, что необходимо выполнить эту операцию во втором потоке, поскольку доступ к двум блокирующим потокам из одного и того же потока приведет к тупику (см. Статью выше).

...