1

次を使用してbashターミナルのインスタンスを呼び出すコードがあります-

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

次に、呼び出された bash のインスタンスで unix コマンドを実行するために、次のような 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インスタンスに実際にコマンドを渡していません. したがって、1 日の終わりに、40 個のコマンドが構築されている場合、約 16 ~ 18 個のドキュメントのみが印刷されます。すべてのコマンドを一度にプリンターに送信しているため、損失が発生していると思われます。この損失をなくしたいと考えています。

ポインタはありますか??

ありがとう

4

1 に答える 1

1

ループに out.flush() を入れてみてください。これにより、作成した BufferedWriter のバッファーがフラッシュされます。

もう 1 つのヒントは、すべてのコマンドに対して 1 つの bash exec を使用することを避け、代わりにコマンドを個別に構築して実行することです。Runtime.exec() の代わりにProcess Builderを使用することを検討してください。

于 2010-07-24T09:00:39.517 に答える