java--BIO、NIO、AIO

java 的IO是什么?

Java程序中,对于数据的输入/输出操作 都是以“流”的方式进行的,java io就是用来进行数据的操作的。

JAVA IO 的三种类型

同步阻塞的BIO
同步非阻塞的NIO
异步非阻塞的AIO

同步 : 使用同步IO时,Java自己处理IO读写。
异步 :使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,OS需要支持异步IO操作API。
阻塞 :使用阻塞IO时,Java调用会一直阻塞到读写完成才返回。
非阻塞 : 使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成。

1.BIO(同步阻塞)

当对一个数据源进行IO操作时,其他操作流都不能对这个数据源进行操作,必须等操作玩,其他操作流才能对该数据进行操作。
为什么是同步阻塞?
它其实就是服务端创建一个ServerSocket, 然后就是客户端用一个Socket去连接服务端的那个ServerSocket, ServerSocket接收到了一个的连接请求就创建一个Socket和一个线程去跟那个Socket进行通讯。接着客户端和服务端就进行阻塞式的通信,客户端发送一个请求,服务端Socket进行处理后返回响应。
每次一个客户端接入,都需要在服务端创建一个线程来服务这个客户端
(1)字节流 读取单个字节(Stream结尾的都是)
输入流InputStream:从外部数据源读取数据到程序内部。
输出流OutputStrem:从程序输出数据到外部数据源

Inputstream(输入流)
ByteArrayInputstream (数组操作)
PipedInputStream(管道操作)
FilterInputStream(过滤输入流,对字节流进行装饰)
BufferedInputStream(带有缓冲的字节流操作)
DataInputStream(基本数据类型操作)
FileInputStream (文件操作)
ObjectInputStream(对象操作,序列化)
outputstream(输出流)
ByteArrayOutputStream(数组操作)
PipedOutputStream(管道操作)
FilterOutputStream(过滤输出流,对字节流进行装饰)
BufferedOutputStream(带有缓冲的字节流操作)
DataOutputStream(基本数据类型操作)
PrintStream(打印)
FileOutputStream(文件操作)
ObjectOutputStrem(对象操作,反序列化)

(2)字符流 读取单个字符 (Reader,Wirter 结尾的都是字符流)
Reader(输入流)
CharArrayReader(数组操作)
PipedReader(管道操作)
FilterReader(过滤流,对字符流进行装饰)
BufferedReader(带有缓冲的字符流操作)
InputStreamReader(转换流)
FileReader(文件操作)

Wirter(输出流)
CharArrayWirter(数组操作)
PipedWirter(管道操作)
FilterWirter(过滤流,对字符流进行装饰)
BufferedWriter(带有缓冲的字符流操作)
OutputStreamWriter(转换流)
FileWriter (文件操作)
PrintWriter(打印)

代码样例:文件操作流对文件的简单操作

读取文本文档的内容

package file;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class BIO {
    public static void  main (String args[]) throws IOException {
        //根据指定路径创建一个文件句柄
        File file =new File( "C:\\Users\\Lenovo\\Desktop\\hello.txt");
        FileInputStream fis = null;
        try {
          //打开此文件的操作流程
            fis = new FileInputStream(file);
            byte[] bytearr = new byte[128];
         //读取指定长度的数据
            fis. read(bytearr);
            String str = new String (bytearr);
            System.out.println(str);
            
		 //打开输出流 
            FileOutputStream fos = new FileOutputStream(file);
            String   string=  new String("alaaalalalalalala");
         //将文本文档的内容由hello改变成alaaalalalalalala
            fos.write(string.getBytes());
            fos.close();
		
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {
            fis.close();
        }
    }
}

使用BufferedInputStream 操作的话将 FileInputStream fis = null; 改成 BufferedInputStream fis = null;
将 fis = new FileInputStream(file);改成 fis = new BufferedInputStream(new FileInputStream(file));
在这里插入图片描述
在这里插入图片描述

2.NIO(同步非阻塞)

为什么说NIO为啥是同步非阻塞?
因为无论多少客户端都可以接入服务端,客户端接入并不会耗费一个线程,只会创建一个连接然后注册到selector上去,这样你就可以去干其他你想干的其他事情了,一个selector线程不断的轮询所有的socket连接,发现有事件了就通知你,然后你就启动一个线程处理一个请求即可,这个过程的话就是非阻塞的。但是这个处理的过程中,你还是要先读取数据,处理,再返回的,这是个同步的过程。

扫描二维码关注公众号,回复: 9553562 查看本文章

NIO的3个核心概念
Buffer(缓冲区)
Channel(通道)
Selector(选择器)
1.缓冲区(Buffer)
要通过NIO写数据到文件或者网络,或者是从文件和网络读取数据出来此时就需要通过Buffer缓冲区来进行。
Buffer的使用一般有如下几个步骤:写入数据到Buffer,调用flip()方法,从Buffer中读取数据,调用clear()方法或者compact()方法。
Buffer包含一些要写入或者刚读出的数据

每一种Java基本类型(除了Boolean)都对应一种缓冲区,具体如下:
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
使用buffer时,要定义buffer的大小。
在这里插入图片描述
2.读写通道(Channel)
Channel 是一个对象,可以通过它读取和写入数据。拿 NIO 与原来的 I/O 做个比较,通道就像是
流。这个通道插向缓冲区,进行数据读写。网络数据通过Channel读取和写入。

Channel有四种实现:
FileChannel:是从文件中读取数据。
DatagramChannel:从UDP网络中读取或者写入数据。
SocketChannel:从TCP网络中读取或者写入数据。
ServerSocketChannel:允许你监听来自TCP的连接,就像服务器一样。每一个连接都会有一个SocketChannel产生。

3.Selector选择器
Selector选择器可以监听多个Channel通道感兴趣的事情(read、write、accept(服务端接收)、connect,实现一个线程管理多个Channel,节省线程切换上下文的资源消耗。Selector只能管理非阻塞的通道,FileChannel是阻塞的,无法管理。

在这里插入图片描述

3.AIO(异步非阻塞)

AIO与NIO类似,只是NIO需要自己去轮询判断操作系统完成的状态,而AIO的话,操作系统会来回调客户端的接口, 告诉你操作完成了。

为什么说AIO是异步非阻塞?
通过AIO发起个文件IO操作之后,你立马就返回可以干别的事儿了,接下来你也不用管了,操作系统自己干完了IO之后,告诉你说ok了。
当你基于AIO的api去读写文件时, 当你发起一个请求之后,剩下的事情就是交给了操作系统当读写完成后, 操作系统会来回调你的接口, 告诉你操作完成。在这期间不需要等待, 也不需要去轮询判断操作系统完成的状态,你可以去干其他的事情。同步就是自己还得主动去轮询操作系统,异步就是操作系统反过来通知你。所以来说, AIO就是异步非阻塞的。

发布了59 篇原创文章 · 获赞 11 · 访问量 2241

猜你喜欢

转载自blog.csdn.net/qq_41219586/article/details/104517281
今日推荐