2016-07-06 10 views
1

私のアプリケーションは大きなInputStreamを多数取得し、ByteBuffersを期待するドライバにそれらを渡す必要があります。 Java InputStream to ByteBufferは、最初にバイト配列に変換することをお勧めします。しかし、それは高価であり、実際にはNIOを使用することの全体的なポイントを失ってしまいます。私はByteBufferを期待しているドライバが、必要なときにInputStreamから読み込むことができる方法を探しています。java配列全体をロードせずにByteBufferとしてのInputStreamを表示

私が扱っているケースでは、InputStream全体を一度に消費して配列に変換するのは高価で無駄です。

+1

問題はドライバです。ファイル全体をメモリに読み込むことを期待しています。貧しいデザイン。 – EJP

答えて

0

私はこれが可能だとは思わない。 ByteBufferを使用している場合でも、InputStreamから読み込む場合でも、最終的に誰かによって作成されたバイト配列を使用しています。バイト配列をバッファに渡すと、バッファは新しいバイト配列を初期化せず、実際に渡しているものを再利用します。このフラグメントは、Java 8のソースコードから直接取られる自分の目で確かめてください:

ByteBuffer(int mark, int pos, int lim, int cap, // package-private 
274     byte[] hb, int offset) 
275  { 
276   super(mark, pos, lim, cap); 
277   this.hb = hb; 
278   this.offset = offset; 
279  } 

あなたは0違約金ありagain.Soまっすぐ、それはそれを上に対処されていないのByteBufferをバイト配列を使用している上記の断片で見たようあなたがバイト配列を読み込んだという事実のために。実際にリンクしている投稿を適用することを恐れるべきではありません。パフォーマンス上のペナルティはありません。

2

最初にInputStream全体を読まなければ、ほとんどこれを行うことはできません。

ByteBuffer APIはランダムアクセスですが、InputStreamは厳密にシーケンシャルです。

ByteBufferのコンストラクタはパッケージプライベートであり、java.nioパッケージが制限されているため、独自のサブクラスを作成することはできません。つまり、InputStreamByteBufferにラップすることはできません。 ByteBuffer.wrap(byte[])またはByteBuffer.allocateDirect()のいずれかを使用する必要があります。

関連する問題