绕不开的NIO

163 阅读1分钟

Bio和Nio 1.Bio是什么,bio有什么缺点

看下api 基于net 和io包 客户端: 1.1 public class BIOClient {

private static Charset charset = Charset.forName("UTF-8");
public static void main(String[] args) throws Exception {
	Socket s = new Socket("127.0.0.1", 8080);
	OutputStream out = s.getOutputStream();

	Scanner scanner = new Scanner(System.in);
	System.out.println("请输入:");
	String msg = scanner.nextLine();
	out.write(msg.getBytes(charset)); // 阻塞,写完成
	scanner.close();
	s.close();
}

}

server端: 1.2

public class BIOServer1 {

private static ExecutorService threadPool = Executors.newCachedThreadPool();
public static void main(String[] args) throws Exception {
    ServerSocket serverSocket = new ServerSocket(8080);
    System.out.println("tomcat 服务器启动成功");
    while (!serverSocket.isClosed()) {
        Socket request = serverSocket.accept();
        System.out.println("收到新连接 : " + request.toString());
        threadPool.execute(() -> {
            try {
                // 接收数据、打印
                InputStream inputStream = request.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
                String msg;
                while ((msg = reader.readLine()) != null) { // 阻塞
                    if (msg.length() == 0) {
                        break;
                    }
                    System.out.println(msg);
                }
                System.out.println("收到数据,来自:"+ request.toString());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    request.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    serverSocket.close();
}

}

可以看到 inputStream基本上都是基于阻塞api的; 1.2 什么是Nio 基于BIO的缺点加以改进,所涉及的api都是非阻塞的;当大量请求处理时也不会阻塞io线程;

看下api Java文件流抽象api的传统io操作基本都是阻塞的,他的磁盘的读写还是很慢的。 java1.4 Nio 基于通道和缓冲区 彻底颠覆传统IO的阻塞情况;

Nio Buffer

Channel 类比与BIO stream 流