5

Java プログラムから外部プログラムを実行しようとしていますが、問題があります。基本的に私がやりたいことはこれです:

 Runtime.getRuntime().exec("./extprogram <fileIn >fileOut");

しかし、私はそれがうまくいかないことを発見しました.Javaの外観は、Process私が経験していない入力ストリームと出力ストリームやその他のものを使用する必要があります。

私はインターネット全体で多くの例を見てきました(その多くはSOからのものです)、これを行うための単純な標準的な方法はないようです。何が起こっているのかを完全に理解していない人にとっては、非常にイライラする可能性があります。

また、他の人のコードの例から自分のコードを作成しようとしても問題があります。なぜなら、一般的に他のほとんどの人は 1. リダイレクトstdinに興味がなく、2. 必ずしもstdoutファイルにリダイレクトするわけではなく、代わりにSystem.out.

それで、誰かが外部プログラムを呼び出してリダイレクトするための良い単純なコードテンプレートの方向に私を向けることができstdinますstdoutか? ありがとう。

4

3 に答える 3

9

次のようなことを試すことができます:

ProcessBuilder pb = new ProcessBuilder();
pb.redirectInput(new FileInputStream(new File(infile));
pb.redirectOutput(new FileOutputStream(new File(outfile));
pb.command(cmd);
pb.start().waitFor();
于 2012-07-04T23:09:34.697 に答える
7

を使用する必要がある場合はProcess、次のようなものが機能するはずです。

public static void pipeStream(InputStream input, OutputStream output)
   throws IOException
{
   byte buffer[] = new byte[1024];
   int numRead = 0;

   do
   {
      numRead = input.read(buffer);
      output.write(buffer, 0, numRead);
   } while (input.available() > 0);

   output.flush();
}

public static void main(String[] argv)
{
   FileInputStream fileIn = null;
   FileOutputStream fileOut = null;

   OutputStream procIn = null;
   InputStream procOut = null;

   try
   {
      fileIn = new FileInputStream("test.txt");
      fileOut = new FileOutputStream("testOut.txt");

      Process process = Runtime.getRuntime().exec ("/bin/cat");
      procIn = process.getOutputStream();
      procOut = process.getInputStream();

      pipeStream(fileIn, procIn);
      pipeStream(procOut, fileOut);
   }
   catch (IOException ioe)
   {
      System.out.println(ioe);
   }
}

ノート:

  • closeストリームに必ず
  • バッファリングされたストリームを使用するようにこれを変更します。生のInput/OutputStreams実装では一度に 1 バイトずつコピーされる可能性があると思います。
  • プロセスの処理は、特定のプロセスに応じて変わる可能性があります。catこれは、パイプされた I/O を使用した最も単純な例です。
于 2012-07-04T23:33:30.923 に答える
0

System.setIn と System.setOut を試しましたか? JDK 1.0 から存在しています。

public class MyClass
{
    System.setIn( new FileInputStream( "fileIn.txt" ) );
    int oneByte = (char) System.in.read();
    ...

    System.setOut( new FileOutputStream( "fileOut.txt" ) );
    ...
于 2012-07-05T00:11:13.360 に答える