Java NIO学习-详细内容

一、三大类

  1、Channels

  2、Selector与SelectionKey

  3、Buffer及其子类

  说明:所有的Channel都需要和Buffer类结合使用,通过Buffer类实现缓冲区

     直接通过Channels即可实现同步非阻塞io,SelectableChannel类configureBlocking(boolean block)方法配置是否阻塞,false不阻塞,默认true.(由上图可知,FileChannel是不能配置阻塞非阻塞的,因为直接通过系统IO读到文件,不会有阻塞和非阻塞的区分)

     通过Selector与SelectionKey可以实现IO多路复用

  nio包结构:

  

  nio包接口:

  

  Channels类说明:

  主要负责把InputStream和OutputStream转为Channel,把Channel转为InputStream、OutputStream、Reader、Writer,经典IO与NIO互相转换

       static ReadableByteChannel newChannel(InputStream in)
    static WritableByteChannel newChannel(OutputStream out)
    static InputStream newInputStream(ReadableByteChannel ch)
    static OutputStream newOutputStream(WritableByteChannel ch)
    static Reader newReader(ReadableByteChannel ch, CharsetDecoder dec, int minBufferCap)
    static Reader newReader(ReadableByteChannel ch, String csName)
    static Writer newWriter(WritableByteChannel ch, CharsetEncoder enc, int minBufferCap)
    static Writer newWriter(WritableByteChannel ch, String csName)

  接口说明

  Channel接口:void close();boolean isOpen()

  ReadableByteChannel接口:int read(ByteBuffer dst)

  WritableByteChannel接口:int write(ByteBuffer src)

  ByteChannel接口:实现了以上所有接口的接口

  ScatteringByteChannel接口:long read(ByteBuffer[] dsts);long read(ByteBuffer[] dsts, int offset, int length) 。读取一个网络协议的不同部分时有用,如http协议的header和body。

        分散 读取操作可在单个调用中将一个字节序列读入一个或多个给定的缓冲区序列。分散读取通常在实现网络协议或文件格式时很有用,例如将数据分组放入段中(这些段由一个或多个长度固定的头,后跟长度可变的正文组成)。

  GatheringByteChannel接口:long write(ByteBuffer[] srcs) ;long write(ByteBuffer[] srcs, int offset, int length)

        集中 写入操作可在单个调用中写入来自一个或多个给定缓冲区序列的字节序列。集中写入通常在实现网络协议或文件格式时很有用,例如将数据分组放入段中(这些段由一个或多个长度固定的头,后跟长度可变的正文组成)。
  InterruptibleChannel接口:void close()。可被异步关闭和中断的通道。 也可使用线程的interrupt方法来关闭。调用close与调用interrupt都将引发Exception,Exception不同,参看api文档。

时间: 2024-12-19 07:08:52

Java NIO学习-详细内容的相关文章

Java NIO学习-详细内容(三)

九.nio.file 该包是1.7新出的,包含了一系列高级的文件和目录操作方法 1.控制目录属性,只读,系统之类的 2.监控文件及文件夹的改变的WatchService public void startWatch() throws IOException, InterruptedException { final FileSystem fileSystem = FileSystems.getDefault(); try (final WatchService watchService = fi

Java NIO学习-详细内容(二)

五.Selector与SelectionKey Selector是SelectableChannel 对象的多路复用器,为什么使用Selector? 仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道.事实上,可以只用一个线程处理所有的通道.对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源(如内存).因此,使用的线程越少越好. 但是,需要记住,现代的操作系统和CPU在多任务方面表现的越来越好,所以多线程的开销随着时间的推移,变得越来越小了

java nio学习笔记(一)

位置保留,待用 java nio学习笔记(一),布布扣,bubuko.com

Java NIO学习

Java NIO学习 为什么要使用New IO? NIO是jdk1.4加入的新包,NIO的创建目的是为了让java程序员可以实现高速I/O而无需编写自定义的本机代码.NIO将最耗时的I/O操作(即填充和提取缓冲区)转移到操作系统 ,因而可极大的提高速度. 流与块的比较 原来的I/O库与NIO最重要区别是数据打包和传输方式.原来的I/O以流的方式处理数据,而NIO以块的方式处理数据. 面向流的I/O系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据.不利的一面是

Java NIO学习笔记(一)

文章目录: 1.什么是IO 2.什么是Java NIO 3.I/O常见概念 4.为什么使用NIO 5.IO VS NIO 一.什么是IO I/O 或者输入/输出 , 指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的.单独的程序一般是让系统为它们完成大部分的工作.在 Java 编程中,直到最近一直使用 流 的方式完成 I/O.所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象

Java NIO 学习总结 学习手册

原文 并发编程网(翻译):http://ifeve.com/java-nio-all/  源自 http://tutorials.jenkov.com/java-nio/index.html Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中. Java NIO: Non-blocking IO(非阻塞IO

Java NIO学习笔记

NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的. Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启

Java NIO学习笔记八 DatagramChannel

Java NIO DatagramChannel Java NIO DatagramChannel是可以发送和接收UDP数据包的通道.由于UDP是一种无连接网络协议,因此您不能默认读取和写入DatagramChannel其他通道.而是发送和接收数据包. 打开DatagramChannel 打开一个DatagramChannel代码: DatagramChannel channel = DatagramChannel.open(); channel.socket().bind(new InetSo

java nio学习(八)

SocketChannel Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器. 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel. 打开 SocketChannel 下面是SocketChannel的打开方式: SocketChannel socketChannel = SocketChannel.ope