ストリームからの入力データを複数のバッファに分割したいと考えています。私は NIO チャネルを調査しましたが、InputStream で C の readv() と同等のことを行う方法を見つけることができないようです。ファイル、ソケットなどはすべてカバーされているようですが、ストリームはカバーされていません。ScatteringByteChannel が最も有望に見えますが、InputStream から設定できませんでした。これを行う方法はありますか?
ヒントをありがとう。
- クリス
nio
高レベルのインターフェースが提供するものとは対照的に、かなり低レベルのインターフェースを検討してくださいjava.io
。高レベル ストリームでは、任意の実装を使用できます。一度に 1 バイトを読み取ることができる限り、それをストリームに変換できます。nio クラスは、バルク データに対する生の最適化された操作用です。その最適化を行うには、データがどこから来たのかをよく知っている必要があります。そして、ジェネリックInputStream
は単にそのイメージに適合しません.
そのため、入力ストリームからのデータを複数のバッファに分散させることはできますが、すべての入力ストリームに対して移植可能に分散する最適化された方法はありません。nio
したがって、パフォーマンスが向上しないため、これを自分で実装することもできます。
参照する C インターフェイスは、stdlib で使用されるものreadv
とは対照的に、低レベルの整数ファイル ハンドルのみを受け入れることに注意してください。FILE*
前者は、生のバッファリングされていないカーネル ストリームのみを示すことができます。後者は何かを意味する可能性がありますが ( fopencookie
manpage を参照)、生の最適化されたアクセスは提供しません。