BufferedReader.readLine方法是阻塞式的,它将一直等待,直到读取到数据或者数据流结束。如果需要非阻塞式的读取方式,可以使用java.nio中的通道和缓冲区实现。
示例代码:
// 创建一个非阻塞式的读取通道
Selector selector = Selector.open();
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
// 创建一个缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(true){
selector.select();
Set keys = selector.selectedKeys();
Iterator keyIter = keys.iterator();
while(keyIter.hasNext()){
SelectionKey key = keyIter.next();
if(key.isReadable()){
SocketChannel channel = (SocketChannel)key.channel();
int len = channel.read(buffer);
if(len > 0){
buffer.flip();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
String str = new String(bytes);
System.out.println(str);
buffer.clear();
}
}
keyIter.remove();
}
}