Команда zenity bash не работает с Java
Я пытаюсь получить ввод от пользователя с помощью команды zenity. Вот команда, которую я передаю в zenity:
zenity --question --title "Share File" --text "Do you want to share file?"
Вот код, использующий Java для выполнения команды:
private String[] execute_command_shell(String command)
{
System.out.println("Command: "+command);
StringBuffer op = new StringBuffer();
String out[] = new String[2];
Process process;
try
{
process = Runtime.getRuntime().exec(command);
process.waitFor();
int exitStatus = process.exitValue();
out[0] = ""+exitStatus;
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null)
{
op.append(line + "\n");
}
out[1] = op.toString();
}
catch (Exception e)
{
e.printStackTrace();
}
return out;
}
Хотя я получаю диалоговое окно вывода, заголовок содержит только первое слово "Поделиться", а в тексте вопроса также отображается только одно слово "Делать"
Есть ли объяснение этому странному поведению? Какая работа вокруг?
1 ответ
Это сработало для меня:
Runtime.getRuntime().exec(new String[]{"zenity","--question","--title","Share File","--text","Do you want to share file?"})
Я бы рекомендовал разделить аргументы в коде Java, чтобы вы могли проверить, а не передавать всю команду с кавычками.
Вот пример, включающий разбиение для обработки кавычек:
String str = "zenity --question --title \"Share File\" --text \"Do you want to share file?\"";
String quote_unquote[] = str.split("\"");
System.out.println("quote_unquote = " + Arrays.toString(quote_unquote));
List<String> l = new ArrayList<>();
for(int i =0; i < quote_unquote.length; i++) {
if(i%2 ==0) {
l.addAll(Arrays.asList(quote_unquote[i].split("[ ]+")));
}else {
l.add(quote_unquote[i]);
}
}
String cmdarray[] = l.toArray(new String[l.size()]);
System.out.println("cmdarray = " + Arrays.toString(cmdarray));
Runtime.getRuntime().exec(cmdarray);
В качестве альтернативы вы можете использовать UiBooster для Java для создания этого диалога. Таким образом, вам не нужно устанавливать zenity, и вы не ограничены linux или gtk для Windows.
String userInput = new UiBooster().showTextInputDialog("Do you want to share file?");