Процесс требует перенаправленного входа

У меня есть собственный исполняемый файл UNIX, который требует, чтобы аргументы были поданы как это

prog.exe <foo.txt.

foo.txt имеет две строки: панель baz

Я использую java.lang. ProcessBuilder для выполнения этой команды. К сожалению, prog.exe будет только работать с помощью перенаправления из файла. Есть ли некоторый способ, которым я могу подражать этому поведению в Java?

Конечно,

ProcessBuilder pb = new ProcessBuilder("prog.exe", "bar", "baz"); 

не работает.

Спасибо!

7
задан stacker 3 June 2010 в 21:23
поделиться

5 ответов

ProcessBuilder pb = new ProcessBuilder("prog.exe");
Process p = pb.start();
OutputStream pos = p.getOutputStream();

InputStream fis = new FileInputStream("file.txt");
byte[] buffer = new byte[1024];
int read = 0;
while((read = fis.read(buffer)) != -1) {
    pos.write(buffer, 0, read);
}
fis.close();

Не тестировалось, но что-то вроде этого должно работать.

9
ответ дан 6 December 2019 в 21:10
поделиться

Постройте процесс с помощью ProcessBuilder, затем используйте process.getOutputStream() , чтобы получить OutputStream, который будет передаваться на стандартный вход процесса.

Откройте файл с помощью обычных методов Java, прочитайте содержимое файла и запишите его в OutputStream, идущий в Процесс, который вы сделали с помощью ProcessBuilder.

Проблема, с которой вы сейчас имеете дело, заключается в том, что вы вызываете ProcessBuilder для запуска

$ prog.exe foo bar

, что, вероятно, не близко к тому, чего вы хотите достичь.

0
ответ дан 6 December 2019 в 21:10
поделиться

В итоге я сделал что-то вроде этого, и это работает. Спасибо за помощь!

    import java.io.BufferedWriter;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.util.LinkedList;
    import java.util.List;

    public class UserInp {

        public static void main(String[] args) {
            new UserInp().sample();
        }

        public void sample() {

            String command = "foo.exe";

            List<String> args = new LinkedList<String>();

            args.add("bar");
            args.add("baz");

            ProcessBuilder pb = new ProcessBuilder(command);
            java.lang.Process process = null;

            try {
                process = pb.start();
            } catch (IOException ex) {
                //--
            }
            OutputStream os = process.getOutputStream();
            PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(os)));

            final InputStream is = process.getInputStream();
            new Thread(new Runnable() {
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(is));
                        String line;
                        while ((line = br.readLine()) != null) {
                            System.out.println(line);
                        }
                    } catch (java.io.IOException e) {
                    }
                }
            }).start();

            for (String arg : args) {
                pw.println(arg);
            }

            pw.close();

            int returnCode = -1;
            try {
                returnCode = process.waitFor();
            } catch (InterruptedException ex) {
                //--
            }
            System.out.println(returnCode);
        }
    }
2
ответ дан 6 December 2019 в 21:10
поделиться

Перенаправление настраивается оболочкой, вам нужно сделать это вручную, примерно так:

Process proc = pb.start();
OutputStreamWriter os = new OutputStreamWriter(proc.getOutputStream());
// then write the data from your file to os
// ...
os.close();
1
ответ дан 6 December 2019 в 21:10
поделиться

Вы пытались обернуть prog.exe в скрипт, который принимает аргументы и занимается prog.exe? Я предполагаю, что вы используете оболочку, поэтому настроить bash-скрипт довольно просто.

Если я понимаю вашу проблему, сценарий будет выглядеть так:

#!/usr/bin/bash
echo $1 > file
echo $2 >> file
prog.exe < file
remove file
0
ответ дан 6 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: