用ByteBuffer快速读取Socket的方法?

时间:2014-03-26 20:16:36

标签: java tcp bytebuffer

我已经通过TCP连接到一个持续发送大量数据的套接字,我需要读取它。到目前为止我所拥有的是一个字节缓冲区,它在while循环中逐字节读取。但我现在使用的测试用例大约是3 MB,在逐字节读取时需要一段时间才能读取。

以下是我的解释代码:

ByteBuffer buff = ByteBuffer.allocate(3200000);
while(true)
{
     int b = in.read();
     if(b == -1 || buff.remaining() == 0)
     {
           break;
     }
     buff.put((byte)b);
}

我知道字节缓冲区不是线程安全的,我不确定是否可以通过一次读取多个字节然后将其存储在缓冲区中来加快速度?什么方式让我加快这个过程?

2 个答案:

答案 0 :(得分:1)

使用批量读取而不是单个字节读取。

byte[] buf = new byte[3200000];
int pos = 0;
while (pos < buf.length) {
  int n = in.read(buf, pos, buf.length - pos);
  if (n < 0)
    break;
  pos += n;
}
ByteBuffer buff = ByteBuffer.wrap(buf, 0, pos);

不是从套接字中获取InputStream,而是填充要包装的字节数组,而是get the SocketChannelread()直接ByteBuffer

答案 1 :(得分:1)

有几种方法。

  1. 使用Channels.newChannel()从输入流中获取频道并使用ReadableByteChannel.read(buffer).

  2. 使用byte[]从缓冲区中获取buffer.array()数组并直接读入in.read(array).确保BB确实有阵列。如果它是一个直接的字节缓冲区,它就不会被激活,但在这种情况下你根本不应该做这一切,你应该使用SocketChannel,否则没有任何好处。

  3. 读入您自己的大字节数组,然后使用批量放入ByteBuffer,注意使用read()方法返回的长度。

  4. 不要这样做。请确定您是想要InputStreams还是ByteBuffers并且不要混淆您的编程隐喻。