Java NIO

Java NIO

NIO即New IO,同步非阻塞IO。这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。

  • NIO和IO的区别

    • IO是面向流的,而NIO是面向缓冲区的
    • IO的各种流是阻塞的,而NIO是非阻塞的
    • Java NIO的选择器允许一个单独的线程来监视多个输入通道
  • 直接缓冲区和非直接缓冲区

    直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中,可以提高效率

    非直接缓冲区:通过allocate()方法分配直接缓冲区,将缓冲区建立在JVM的内存中

  • 通道是什么

    通道主要用于源节点与目标节点的连接。在Java NIO中负责缓冲区中数据的传输。Channel本身不存在数据,因此需要配合缓冲区进行传输

  • 通道与流的区别

    • 通道(Channel)既可以读取数据也可以写入数据,而流是单向的(如InputStream是输入流,OutputStream是输出流)
    • 通道(Channel)不能直接访问数据,只能通过缓冲(Buffer)去访问
    • 通道只在字节缓冲区操作(因为操作系统都是以字节的形式实现底层I/O接口的)
    • 流,就像水流一样,单向,流过去了就不会回来;而通道如其名,双向,可来可去,可读可写。
  • 通道有哪些实现类

    java.nio.channels.Channel 接口

    • java.nio.channels.ByteChannel
    • ava.nio.channels.FileChannel
      |–SocketChannel
      |–ServerSocketChannel
      |–DatagramChannel
  • 通道的获取方式

    java针对支持通道的类提供了getChannel()方法

    本地io:
       FileInputStreanm/FileOutputStream
      RandomAccessFile
    网络io:
      Socket
      ServerSocket
      DatagramSocket

  • 分散与聚集

    分散读取:是指从Channel中读取的数据“分散”到多个buffer中

    聚集写入:是指多个buffer中的数据“聚集”到Channel中

  • 字符集

    编码:字符串–>字节数组

    解码:字节数组–>字符串

  • 同步和异步

    同步就是在发出一个请求后,如果没有得到响应结果,该调用就不会返回,调用者会主动等待消息的返回。而异步就是当调用发出后,不会立刻得到结果,此时调用者就可以去做其他事。等到被调用者通过状态,再通过回调通知机制来通知调用者。

  • 阻塞模式和非阻塞模式

    阻塞模式就是客户端和服务端双方进行通信时,每来一个新的连接,就会新开一个线程来处理这个连接,之后的操作全部由这个线程完成。并且该线程在收到消息前会一直等待,即为阻塞。而非阻塞模式就是只有当收到消息时才会响应,不会一直等待。

  • NIO如何实现非阻塞IO

    非阻塞 IO 的核心在于使用一个 Selector 来管理多个通道,可以是 SocketChannel,也可以是 ServerSocketChannel,将各个通道注册到 Selector 上并且指定监听的事件。之后可以只用一个线程来轮询这个 Selector,看看上面是否有通道是准备好的,当通道准备好可读或可写,然后才去开始真正的读写,这样就能够提高效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值