Вопрос-ответ

Running Command Line in Java [duplicate]

Запуск командной строки в Java [дубликат]

Есть ли способ запустить эту командную строку в приложении Java?

java -jar map.jar time.rel test.txt debug

Я могу запустить это с помощью command, но я не смог сделать это в Java.

Переведено автоматически
Ответ 1
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("java -jar map.jar time.rel test.txt debug");

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

Ответ 2

Вы также можете посмотреть результат следующим образом:

final Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug");

new Thread(new Runnable() {
public void run() {
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;

try {
while ((line = input.readLine()) != null)
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();

p.waitFor();

И не забывайте, что если вы запускаете команду Windows, вам нужно поставить cmd /c перед вашей командой.

РЕДАКТИРОВАТЬ: И для получения бонусных баллов вы также можете использовать ProcessBuilder для передачи входных данных в программу:

String[] command = new String[] {
"choice",
"/C",
"YN",
"/M",
"\"Press Y if you're cool\""
};
String inputLine = "Y";

ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

writer.write(inputLine);
writer.newLine();
writer.close();

String line;

while ((line = reader.readLine()) != null) {
System.out.println(line);
}

При этом будет запущена команда Windows choice /C YN /M "Press Y if you're cool" и выдан ответ Y. Итак, результатом будет:

Press Y if you're cool [Y,N]?Y
Ответ 3

Чтобы избежать блокировки вызываемого процесса, если он выводит много данных на стандартный вывод и / или выдает ошибку, вы должны использовать решение, предоставленное Craigo. Обратите также внимание, что ProcessBuilder лучше, чем Runtime.getRuntime().exec(). Это по нескольким причинам: это лучше маркирует аргументы, а также устраняет стандартный вывод ошибок (проверьте также здесь).

ProcessBuilder builder = new ProcessBuilder("cmd", "arg1", ...);
builder.redirectErrorStream(true);
final Process process = builder.start();

// Watch the process
watch(process);

Я использую новую функцию "watch" для сбора этих данных в новом потоке. Этот поток завершится в вызывающем процессе, когда завершится вызываемый процесс.

private static void watch(final Process process) {
new Thread() {
public void run() {
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
try {
while ((line = input.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
Ответ 4
Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug");
java