У меня есть собственный исполняемый файл UNIX, который требует, чтобы аргументы были поданы как это
prog.exe <foo.txt.
foo.txt имеет две строки: панель baz
Я использую java.lang. ProcessBuilder для выполнения этой команды. К сожалению, prog.exe будет только работать с помощью перенаправления из файла. Есть ли некоторый способ, которым я могу подражать этому поведению в Java?
Конечно,
ProcessBuilder pb = new ProcessBuilder("prog.exe", "bar", "baz");
не работает.
Спасибо!
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();
Не тестировалось, но что-то вроде этого должно работать.
Постройте процесс с помощью ProcessBuilder
, затем используйте process.getOutputStream()
, чтобы получить OutputStream, который будет передаваться на стандартный вход процесса.
Откройте файл с помощью обычных методов Java, прочитайте содержимое файла и запишите его в OutputStream
, идущий в Процесс, который вы сделали с помощью ProcessBuilder
.
Проблема, с которой вы сейчас имеете дело, заключается в том, что вы вызываете ProcessBuilder
для запуска
$ prog.exe foo bar
, что, вероятно, не близко к тому, чего вы хотите достичь.
В итоге я сделал что-то вроде этого, и это работает. Спасибо за помощь!
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);
}
}
Перенаправление настраивается оболочкой, вам нужно сделать это вручную, примерно так:
Process proc = pb.start();
OutputStreamWriter os = new OutputStreamWriter(proc.getOutputStream());
// then write the data from your file to os
// ...
os.close();
Вы пытались обернуть prog.exe
в скрипт, который принимает аргументы и занимается prog.exe
?
Я предполагаю, что вы используете оболочку, поэтому настроить bash-скрипт довольно просто.
Если я понимаю вашу проблему, сценарий будет выглядеть так:
#!/usr/bin/bash
echo $1 > file
echo $2 >> file
prog.exe < file
remove file