Java.lang.Runtime

У меня есть кусок кода, который вызывает экземпляр терминала Bash с помощью следующего:

proc = Runtime.getRuntime().exec("/bin/bash", null, working-dir);

а затем для запуска команд Unix на этом вызываемом экземпляре bash я использую объект PrintWriter, подобный этому:

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);

Затем я использую объект PrintWriter для фактического выполнения команд следующим образом:

out.println("pwd");
out.println("ls >a.txt");

Хотя обе команды, кажется, работают отлично, у меня есть проблема в случае, когда я создаю команду на основе некоторого пользовательского ввода. Конкретно, я создаю команду для отправки некоторых файлов на принтер в сети, и я делаю это так:

while ((strLine = br.readLine()) != null)   {
cmd= blah +blah +blah;//Construction of the command
out.println(cmd);
}

Что на самом деле происходит в приведенном выше фрагменте кода, так это то, что br читает из файла, который содержит все файлы, которые должны быть напечатаны, а затем в команду входит строка с именем файла, и я записываю ее в объект PrintWriter.

проблема, с которой я сталкиваюсь, заключается в том, что, я думаю, что происходит какая-то очередь, и объект PrintWriter фактически не передает команду вызываемому экземпляру bash каждый раз, когда создается команда. Таким образом, в конце концов, если создается 40 команд, печатается только 16-18 документов. Я думаю, это потому, что он отправляет все команды на принтер за один раз, что приводит к потере. Я хочу устранить эту потерю.

Какие-нибудь указатели??

Спасибо p1nG

1 ответ

Решение

Попробуйте добавить out.flush() в свой цикл. Это очистит буфер в BufferedWriter, который вы создали.

Другой совет может заключаться в том, чтобы не пытаться использовать один bash exec для всех команд, а вместо этого создавать и выполнять команду по отдельности. Попробуйте использовать Process Builder вместо Runtime.exec().

Другие вопросы по тегам