io和nio区别?
io和nio都是Java中的I/O操作方式,不同之处在于:
IO是阻塞I/O操作模式,即当执行输入/输出操作时,程序将被阻塞,直到操作完成。这意味着如果想要同时处理多个I/O操作,则需要多线程或多进程来实现。
NIO则是非阻塞I/O操作模式,也就是说当执行输入/输出操作时,程序不会被阻塞,而是继续执行其他任务。这使得单个线程可以同时处理多个I/O操作。
NIO还引入了缓冲区概念,用户可以先将数据读取到内存缓冲区中,然后一次性写入或读取,可以避免频繁的I/O操作。
NIO还引入了选择器(Selector)的概念,它可以管理多个通道的状态,当通道发生I/O事件时,选择器会通知程序进行相应的处理。这种方式更加高效灵活,适用于服务器等高并发场景。
IO是面向流的,NIO是面向缓冲区的。
NIO不在是和IO一样用OutputStream和InputStream 输入流的形式来进行处理数据的,但是又是基于这种流的形式,而是采用了通道和缓冲区的形式来进行处理数据的。NIO比传统的BIO核心区别就是,NIO采用的是多路复用的IO模型,普通的IO用的是阻塞的IO模型,两个之间的效率肯定是多路复用效率更高。
还有一点就是NIO的通道是可以双向的,但是IO中的流只能是单向的。
还有就是NIO的缓冲区(其实也就是一个字节数组)还可以进行分片,可以建立只读缓冲区、直接缓冲区和间接缓冲区,只读缓冲区很明显就是字面意思,直接缓冲区是为加快 I/O 速度,而以一种特殊的方式分配其内存的缓冲区。
io和nio区别与应用?
JAVA在JDK1.4之后引入了一个新的库NIO,其实他的作用跟IO相同,只是他们的实现方式不同,NIO的效率要高于IO。
一 面向流和面向缓冲
IO:面向流,阻塞IO
NIO:面向缓存,非阻塞IO,包含类:Channel(通道),Buffer(缓冲区), Selector(选择区)
IO面向流,每次从流中读取一个或者多个字节,直到读取完所有字节,在此过程中不能执行其他操作,也不能移动流中的数据。
NIO面向缓冲,将数据从通道读取到缓冲区或者从缓冲区写入通道,通过selector监听多个通道事件,实现单线程监听多个数据通道,而且数据还能在缓冲区前后移动,使处理方式更加灵活,不过需要注意的是在更多数据存入缓冲区的时候,不要覆盖缓冲区尚未处理的数据
二 阻塞和非阻塞
Java IO流是阻塞的,当一个线程调用read()或write()时,该线程被阻塞,直到完成整个流的读写操作后,该线程才能执行其他操作。而Java NIO是非阻塞的,利用事件驱动机制,事件收到再去触发,当一个线程发出请求读取数据,在没有得到响应之前,线程是空闲的,就不会让线程阻塞,当前线程仍然可以去执行其他操作,包括写也是一样,在此模式下一个单独的线程可以管理多个输入输出通道。
三 应用场景
NIO是为了弥补IO的缺陷而诞生的,但是NIO也有相应缺点,NIO每一次数据处理都是对缓冲区进行的,那么读取之前就要检查缓冲区数据是否完整或已经被读取完毕。因此少量连接,但是要传输大量数据适用于IO,而NIO适用于大量连接,却只传输少量数据,比如聊天工具等。