啥也不说先上代码,这是一个很简单的从本地文件中读取数据的程序
public class FileBioTest {
public static void main(String[] args) throws Exception {
BufferedReader reader = null;
try {
//2号参数可以指定缓冲区大小 默认8192
reader = new BufferedReader(new FileReader("E:\\test.txt"));
StringBuilder content = new StringBuilder();
reader.lines().forEach(content::append);
System.out.println(content);
} finally {
if (Objects.nonNull(reader)) {
reader.close();
}
}
}
}
文件内容:
你要悄悄的优秀,
然后惊艳所有人。
控制台输出:
这是一个很简单的文件内容读取程序,但是它可能代表不了BIO,他只能代表IO。因为文件读取总是阻塞的,现代操作系统都有复杂的缓存和预取机制,使得本地磁盘 I/O 操作延迟很少,这样就使得非阻塞 这一操作意义不大。所以BIO,NIO概念更多的针对的都是网络数据传输。
BIO被叫做同步阻塞IO,阻塞强调等待,同步强调顺序,阻塞强调资源获取方式,同步强调处理资源的业务逻辑。
堵塞:当资源不可用时,IO会一直等待,直到超时或者反馈
非堵塞:当资源不可用时,IO请求会直接返回,并标识资源不可用,但是不妨碍我下一次接着请求。
同步:当前IO操作执行完才会执行下一个操作。
异步:当前IO操作执行的同时,处理别的操作。当操作完成,告知用户即可。
那么阻塞占用CPU资源吗?其实不占用或者占用很少,这里的阻塞是强调IO阻塞,不是线程阻塞,在IO设备与CPU交互的方式中有一种名为中断的交互方式。IO阻塞,线程挂起不再执行,等待中断信号,唤醒然后继续执行。这就跟我们前边说的 阻塞强调等待,强调资源获取方式对应起来了。
之前我们说只有网络IO才有阻塞和非阻塞的区别,那我们开始写一个程序来体验一下阻塞。
public class BioBaseServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(9090);
System.out.println("create socket, listen 9090");
Socket client = serverSocket.accept();
System.out.println