7

NIOを使用してプロセスからstdoutを処理することは可能ですか?私はそれをjava.ioで動作させていますが、これはNIOについてもう少し学び、パフォーマンスの向上の可能性を探求するための演習のようなものです。

基本的に、大量のテキストをstdoutからバッファにブロックせずにできるだけ速くストリーミングし、後でそのバッファの内容を処理したいと思います。問題は、NIOで動作させるための適切なブードゥーを理解できないようです。これが私が今いるところです:

ProcessBuilder pb = new ProcessBuilder( ... );
Process p = pb.start();
stdout = new StreamConsumer(p.getInputStream());
new Thread(stdout).start();
// other stuff omitted for brevity

StreamConsumerクラスは次のようになります。

class StreamConsumer implements Runnable
{
  private InputStream is;

  public StreamConsumer(InputStream is)
  {
    this.is = is;
  }

  public void run()
  {
    try
    {
      ReadableByteChannel source = Channels.newChannel(is);

      // Is it possible get a channel to a ByteBuffer 
      // or MappedByteBuffer here?
      WritableByteChannel destination = ??;
      ByteBuffer buffer = ByteBuffer.allocateDirect(128 * 1024);

      while (source.read(buffer) != -1)
      {
        buffer.flip();
        while (buffer.hasRemaining())
        {
          destination.write(buffer);
        }
        buffer.clear();
      }

      source.close();
      destination.close();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
}
4

3 に答える 3

8

Java と子プロセス間のノンブロッキング I/O を可能にするオープン ソース ライブラリを作成しました。ライブラリは、イベント駆動型のコールバック モデルを提供します。Linux の epoll、MacOS X の kqueue/kevent、Windows の IO Completion Ports など、プラットフォーム固有のネイティブ API を使用するのは、JNA ライブラリに依存します。

このプロジェクトはNuProcessと呼ばれ、次の場所にあります。

https://github.com/brettwooldridge/NuProcess

于 2013-09-17T03:57:48.087 に答える
5

信じられないかもしれませんが、あなたが望む書き込み可能なバイトチャネルは

ByteArrayOutputStream ostream = new ByteArrayOutputStream(<some large number>);
WritableByteChannel destination = Channels.newChannel(ostream);

その後、完了したら

ostream.toByteArray() 

処理するバイトが含まれます。または、バイトバッファが必要な場合は、

ByteBuffer.wrap(ostream.toByteArray())

ランナブルの外で出力を取得する方法はわかりませんが、元のコードにはそれがあったと思います。StreamConsumerそうでなければ、を にしたいかもしれませんCallable<ByteBuffer>

于 2009-06-23T16:46:02.500 に答える
1

StreamConsumer を Callable にしたい場合があります。

試行すべきもう 1 つの非ブロッキング オプションは、Guava の ListenableFuture を使用して、独自のエラーを解釈せずに成功および失敗のコールバックを提供することです。

于 2013-08-24T14:47:40.587 に答える