0

dataInputStream の readFully メッセージを使用して、固定長のバイト配列を次のように読み取ります。

byte[] record = new byte[4660004];

in.readFully(record);

ここでの問題は、これらの多くのバイト (20000 レコードに相当) を読み取るのに 5 秒以上かかる場合があることです。そして、ソケットでこのデータを受信して​​います。クライアントは、4660004 バイトのバイト配列としてデータを送信しています。現在、このようなレコードを 100 万件取得するのに約 5 分かかるため、このデータをより速く受信する方法はありますか。

編集:: 完全なデータフロー:

最初にストリームを作成します:

static DataInputStream dIn = null;

dIn = new DataInputStream(connection.getInputStream());
msgType = dIn.readByte();

int msgIntLen = dIn.readInt();

processBatch(msgIntType, msgIntLen, dIn, connector);

.
.

private static void processBatch(int msgIntType, int msgIntLen, DataInputStream in,
            Connector connector) throws IOException {

   int recordIntLen = in.readInt();
   byte[] record = new byte[msgIntLen - 4];
   in.readFully(record);

}   

そのwudfが役​​立つ場合、どこにバッファリングを含める必要がありますか?

4

1 に答える 1

0

コメントがスクロールし始めたので、回答に移動します。

BufferedOutputStream を使用して、クライアント側で出力をバッファリングします。dlOut.flush()未送信のバイトがバッファリングされた出力ストリームに残らないように、データの書き込み後に必ず呼び出してください。

BufferedInputStream を使用して、クライアント側で入力をバッファリングします。

バイト配列を送信しているだけなので、追加の目的で使用しない限り、おそらく DataInputStream/DataOuputStream は必要ありません。BufferedInputStream/BufferedOutputStream を使用している可能性があります。

于 2011-05-06T21:48:25.730 に答える