Запуск внешней программы с перенаправленным stdin и stdout из Java

Я пытаюсь запустить внешнюю программу из Java-программы, и у меня возникают проблемы. В основном я хотел бы сделать следующее:

Runtime.getRuntime().exec("./extprogram fileOut"); 

Однако я обнаружил, что это не сработает – Java-файлы должны использовать Process с streamами ввода и вывода и другие вещи, с которыми я не сталкиваюсь.

Я рассмотрел ряд примеров по всему миру (многие из которых относятся к SO), и, похоже, нет простого стандартного способа сделать это, что для тех, кто не понимает, что происходит, может быть довольно расстраивающим.

У меня также есть проблемы с попыткой создать собственный код из примеров кода других людей, потому что обычно кажется, что большинство других людей 1. не заинтересованы в перенаправлении stdin , а 2. не обязательно перенаправляют stdout в файл, но вместо этого в System.out .

Итак, кто-нибудь сможет указать мне в сторону любых хороших простых шаблонов кода для вызова внешних программ и перенаправления stdin и stdout ? Благодарю.

Если вы должны использовать Process , то что-то вроде этого должно работать:

 public static void pipeStream(InputStream input, OutputStream output) throws IOException { byte buffer[] = new byte[1024]; int numRead = 0; do { numRead = input.read(buffer); output.write(buffer, 0, numRead); } while (input.available() > 0); output.flush(); } public static void main(String[] argv) { FileInputStream fileIn = null; FileOutputStream fileOut = null; OutputStream procIn = null; InputStream procOut = null; try { fileIn = new FileInputStream("test.txt"); fileOut = new FileOutputStream("testOut.txt"); Process process = Runtime.getRuntime().exec ("/bin/cat"); procIn = process.getOutputStream(); procOut = process.getInputStream(); pipeStream(fileIn, procIn); pipeStream(procOut, fileOut); } catch (IOException ioe) { System.out.println(ioe); } } 

Заметка:

  • Обязательно close streamи
  • Измените это, чтобы использовать буферизованные streamи, я думаю, что Input/OutputStreams реализация Input/OutputStreams может копировать байт за раз.
  • Обработка процесса, вероятно, изменится в зависимости от вашего конкретного процесса: cat – это самый простой пример с канальным вводом-выводом.

Вы можете попробовать что-то вроде этого:

 ProcessBuilder pb = new ProcessBuilder(); pb.redirectInput(new FileInputStream(new File(infile)); pb.redirectOutput(new FileOutputStream(new File(outfile)); pb.command(cmd); pb.start().waitFor(); 

вы пробовали System.setIn и System.setOut? существует с JDK 1.0.

 public class MyClass { System.setIn( new FileInputStream( "fileIn.txt" ) ); int oneByte = (char) System.in.read(); ... System.setOut( new FileOutputStream( "fileOut.txt" ) ); ... 
  • log4j перенаправить stdout на DailyRollingFileAppender
  • C ++ выравнивание при печати cout <<
  • Является ли строка stdout буферной, небуферизованной или неопределенной по умолчанию?
  • Перенаправить stdout + stderr в службу Windows C #
  • Как подключить stderr, а не stdout?
  • Перемотка std :: cout, чтобы вернуться к началу строки
  • В Go, как мне записать stdout функции в строку?
  • Код VBscript для захвата stdout, без отображения windows консоли
  • Отображение вывода командной строки Windows и redirect ее в файл
  • Захват и stdout и stderr в Bash
  • Как сделать python 3 print () utf8
  • Interesting Posts
    Давайте будем гением компьютера.