随着分布式技术的普及和海量数据的增长,io的能力越来越重要,java提供的io模块提供了足够的扩展性来适应。

我是李福春,我在准备面试,今天的问题是:

java中的io有哪几种?

java中的io分3类:

1,BIO ,即同步阻塞IO,对应java.io包提供的工具;基于流模型,虽然直观,代码实现也简单,但是扩展性差,消耗资源大,容易成为系统的瓶颈;

2,NIO,同步非阻塞io,对应java.nio包提供的工具,基于io多路复用;
核心类: Channel ,Selector , Buffer , Charset  
selector是io多路复用的基础,实现了一个线程高效管理多个客户端连接,通过事件监听处理感兴趣的事件。

3,AIO,即异步非阻塞io, 基于事件和回调

io的类层级

java各种IO的例子

java.io客户端连接服务端例子

package org.example.mianshi.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* 说明:传统流式io 客户端连接服务端例子
* @author carter
* 创建时间: 2020年03月25日 9:58 下午
**/ public class JavaIOApp { public static void main(String[] args) { final Server server = new Server();
new Thread(server).start(); try (
Socket socket = new Socket(InetAddress.getLocalHost(), server.getPort());
) {
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); bufferedReader.lines().forEach(System.out::println); } catch (IOException e) {
e.printStackTrace();
}
} public static class Server implements Runnable { private ServerSocket serverSocket; public int getPort() {
return serverSocket.getLocalPort();
} @Override
public void run() { try (ServerSocket serverSocket = new ServerSocket(0);) { this.serverSocket = serverSocket;
while (true) {
final Socket socket = serverSocket.accept();
new RequestHandler(socket).start();
} } catch (IOException e) {
e.printStackTrace();
} } private class RequestHandler extends Thread {
private Socket socket; public RequestHandler(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try (
final PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
) { printWriter.write("hello world");
printWriter.flush(); } catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

使用连接池优化

package org.example.mianshi.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* 说明:传统流式io 客户端连接服务端例子
* @author carter
* 创建时间: 2020年03月25日 9:58 下午
**/ public class ThreadPoolJavaIOApp { public static void main(String[] args) { final Server server = new Server();
new Thread(server).start(); try (
Socket socket = new Socket(InetAddress.getLocalHost(), server.getPort());
) {
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); bufferedReader.lines().forEach(System.out::println); } catch (IOException e) {
e.printStackTrace();
}
} public static class Server implements Runnable { private ExecutorService threadPool = Executors.newFixedThreadPool(4); private ServerSocket serverSocket; public int getPort() {
return serverSocket.getLocalPort();
} @Override
public void run() { try (ServerSocket serverSocket = new ServerSocket(0);) { this.serverSocket = serverSocket;
while (true) {
final Socket socket = serverSocket.accept(); threadPool.submit(new RequestHandler(socket));
} } catch (IOException e) {
e.printStackTrace();
}finally {
threadPool.shutdown();
} } private class RequestHandler implements Runnable {
private Socket socket; public RequestHandler(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try (
final PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
) { printWriter.write("hello world");
printWriter.flush(); } catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

java.nio例子

package org.example.mianshi.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset; /**
* 说明:nio的客户端连接服务端例子
* @author carter
* 创建时间: 2020年03月25日 10:32 下午
**/ public class JavaNioApp { public static void main(String[] args) { new Server().start(); try (
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
) {
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); bufferedReader.lines().forEach(System.out::println); } catch (IOException e) {
e.printStackTrace();
}
} public static class Server extends Thread { @Override
public void run() { try {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress(InetAddress.getLocalHost(), 8888)); serverSocketChannel.configureBlocking(false); final Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { selector.select();
selector.selectedKeys().forEach(selectionKey -> {
sayHelloWorld((ServerSocketChannel) selectionKey.channel());
}); } } catch (IOException e) {
e.printStackTrace();
} } private void sayHelloWorld(ServerSocketChannel channel) { try (SocketChannel socketChannel = channel.accept()) { socketChannel.write(Charset.defaultCharset().encode("hello world nio")); } catch (IOException e) {
e.printStackTrace();
} }
} }

![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200325233150738-94393984.png)

java.nio2例子

package org.example.mianshi.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.nio.charset.Charset; /**
* 说明:TODO
* @author carter
* 创建时间: 2020年03月25日 10:54 下午
**/ public class JavaNio2App { public static void main(String[] args) { new Server().start(); try (
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
) {
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); bufferedReader.lines().forEach(System.out::println); } catch (IOException e) {
e.printStackTrace();
} } public static class Server extends Thread { @Override
public void run() { try {
AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open()
.bind(new InetSocketAddress(InetAddress.getLocalHost(), 9999)); serverSocketChannel.accept(serverSocketChannel, new CompletionHandler<AsynchronousSocketChannel, AsynchronousServerSocketChannel>() {
@Override
public void completed(AsynchronousSocketChannel socketChannel,
AsynchronousServerSocketChannel serverSocketChannel1) {
// serverSocketChannel1.accept(socketChannel, this); socketChannel.write(Charset.defaultCharset().encode("hello world nio2 ")); try {
socketChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void failed(Throwable exc, AsynchronousServerSocketChannel attachment) {
exc.printStackTrace();
}
}); } catch (IOException e) {
e.printStackTrace();
} }
} }

本例子暂时无法运行。只为展示过程;

小结

本篇主要介绍了java提供的3中io,即 BIO,NIO,AIO ; 并提供了一些示例代码辅助理解。

原创不易,转载请注明出处。

面试刷题11:java系统中io的分类有哪些?的更多相关文章

  1. 面试刷题21:java并发工具中的队列有哪些?

    ![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200330183801141-1514127119.png ...

  2. 安利一个基于Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽

    推荐: 接近100K star 的Java学习/面试指南 Github 95k+点赞的Java面试/学习手册.pdf 今天给小伙伴们推荐一个朋友开源的面试刷题系统. 这篇文章我会从系统架构设计层面详解 ...

  3. 牛客网刷题(纯java题型 1~30题)

    牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...

  4. 牛客网刷题(纯java题型 31~60题)

    牛客网刷题(纯java题型 31~60题) 重写Override应该满足"三同一大一小"三同:方法名相同,参数列表相同,返回值相同或者子类的返回值是父类的子类(这一点是经过验证的) ...

  5. leetcode 刷题记录(java)-持续更新

    最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...

  6. 最长绝对文件路径——算法面试刷题1(google),字符串处理,使用tree遍历dfs类似思路

    假设我们通过以下的方式用字符串来抽象我们的文件系统: 字符串"dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"代表了: dir subdir1 su ...

  7. 面试刷题28:如何写出安全的java代码?

    对jdk,jvm,java应用程序的攻击多种多样?那么从java程序员的角度,如何写出安全的代码呢? 我是李福春,我在准备面试,今天的题目是:如何写出安全的java代码? 答:这个需要从功能设计到实现 ...

  8. LeetCode随缘刷题之Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成

    今天给大家分享一个Java经典的面试题,题目是这样的: 本题是LeetCode题库中的49题. 将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成 举个例子:输入["eat&qu ...

  9. 牛客网Java刷题知识点之父类中的私有内容,子类是否具备? 子类不可直接,但可间接访问父类中的私有内容?

    不多说,直接上干货!  父类中的私有内容,子类是否具备? 答:不具备 子类不可直接,但可间接访问父类中的私有内容 这样情况,开发中不所见,但是,面试的时候,必考非常常见.

随机推荐

  1. HBase完全分布式集群搭建

    HBase完全分布式集群搭建 hbase和hadoop一样也分为单机版,伪分布式版和完全分布式集群版,此文介绍如何搭建完全分布式集群环境搭建.hbase依赖于hadoop环境,搭建habase之前首先 ...

  2. 改变生活的移动计算——感受 MobiSys 2015

    MobiSys 2015" title="改变生活的移动计算--感受 MobiSys 2015"> 作者:微软亚洲研究院研究员 张健松 今年的MobiSys会议地点 ...

  3. 改进"尽最大努力交付"的服务

    改进"尽最大努力交付"的服务 网络层的作用就是负责在不同的网段尽力转发数据包,但是负责中专数据包的路由器并不关心数据包的内容和优先顺序.而是先到达的数据包先处理,后到达的数据包排队 ...

  4. 从头认识js-基本概念(关键字,保留字,数据类型)

    语法 ECMAScript的语法大量借鉴了C及其他类C语言(如Java和Perl)的语法.因此,熟悉这些语言的开发人员在接受ECMSAScript更加宽松的语法时,一定会有一种轻松自在的感觉. 区分大 ...

  5. 阿里sentinel说明及使用

    使用说明 如果只是为了让使 用Sentinel 的限流功能,只需要引入相关的jar包依赖. 添加依赖 添加相关模块的Adapter Sentinel为每个构建项目的各个组件都打包成了相应的Adapte ...

  6. tomcat启动出现问题,有待解决

    三月 15, 2017 2:23:41 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRule ...

  7. 小程序自定义switch组件

    如上图,小程序api中的switch组件只能自定义颜色,不能自定义宽高,所以就开始了自己写switch组件. 自定义组件样式 switch组件样式大致如图,样式思路:未选中时为一个长方形有圆角按钮,和 ...

  8. jsp内置对象(三)-----response对象

    response对象  response对象包含了响应客户端请求的有关信息,但在JSP中很少直接用到它.他是HttpServletResponse类的实例,response对象具有页面作用域,即访问一 ...

  9. python之模块中包的介绍

    跨文件夹导入模块 1:有文件夹a,名下有ma功能,在文件夹外调用ma功能的话, 导入import a.ma 运用ma() 或者 from a import ma ma() 2;假定a有多重文件夹,想要 ...

  10. 手写Promise原理

    我的promise能实现什么? 1:解决回调地狱,实现异步 2:可以链式调用,可以嵌套调用 3:有等待态到成功态的方法,有等待态到失败态的方法 4:可以衍生出周边的方法,如Promise.resolv ...