【问题标题】:Read all byte from InputStream从 InputStream 中读取所有字节
【发布时间】:2015-07-23 16:16:03
【问题描述】:

我想从活动 tcp 连接的 InputStream 中异步读取所有字节。输入缓冲区中可能没有任何内容,在这种情况下,我想要一个空字节数组 [] 而不是读取/超时。

我试过这个:

byte[] bytes = IOUtils.toByteArray(tcpInputStream);

但如果 InputStream 中没有任何内容,则读取会挂起,直到 tcp 超时,然后抛出异常。

【问题讨论】:

  • IOUtils 不在标准库中……那么它是什么?它提供异步版本吗?
  • 如果您只想读取立即可用的数据,这就是available() 调用的用途。虽然它很少有用......
  • @dsh:我认为它是 apache commons-io。我对此没有答案,但是,我发现了两个可能对您有所帮助的 stackoverflow 问题:stackoverflow.com/questions/19833068/… 和 stackoverflow.com/questions/5049319/…

标签: java tcp inputstream


【解决方案1】:

你可以使用非阻塞的 SocketChannel:

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

...

SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("127.0.0.1", 80));
ByteBuffer buffer = ByteBuffer.allocate(2048);
int bytesRead;
while ((bytesRead = socketChannel.read(buffer)) >= 0) {
    if (bytesRead == 0)
        Thread.sleep(1000); // do usefull stuff
    else {
        // use the bytes and prepare the buffer for next read
        buffer.clear();
    }
}
socketChannel.close();

服务器关闭连接时还要准备IOException。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2012-12-25
    • 2020-03-11
    • 2020-09-05
    • 2018-06-28
    • 2018-02-17
    相关资源
    最近更新 更多