- I/O 模型
- 阻塞I/O模型(BIO)
- 非阻塞I/O模型
- I/O复用模型(select/poll;epoll)
- select/poll: 顺序扫描fd是否就绪
- epoll: 事件驱动,mmap同一块内存来减少内存复制
- 信号驱动I/O模型(何时可以开始I/O操作)
- 数据准备时间内进程继续执行,准备好了执行信号处理程序
- 执行recvfrom,数据复制(内核空间到用户空间)时阻塞。
- 异步I/O (何时I/O完成)
-
BIO
- 第一种方案 :一个客户端连接一个线程处理
- 第二种方案: 客户端连接又线程池来处理
-
FileChannel 示例
下面是一个使用FileChannel读取数据到Buffer中的示例:
Java代码
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {
System.out.println("Read " + bytesRead);
buf.flip();
while(buf.hasRemaining()){
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。
网友评论