1.作用:在缓冲区与实体之间传输数据的管道
2.通道类型
文件通道和套接字通道
3.创建通道
socket通道
SocketChannel sc1 = SocketChannel.open(); sc1.connect(new InetSocketAddress(hostname, port)); SocketChannel sc2 = SocketChannel.open(new InetSocketAddress(hostname, port)); SocketChannel sc3 = SocketChannel.open(); sc3.bind(new InetSocketAddress(hostname, port))
File通道
RandomAccessFile raf = new RandomAccessFile(file, mode); FileChannel fc1 = raf.getChannel(); FileInputStream in = new FileInputStream(file); FileChannel fc2 = in.getChannel(); FileOutputStream out = new FileOutputStream(file) FileChannel fc3 = out.getChannel();
4.channel通道会连接一个特定的IO服务且性能会受到其连接的IO服务的影响
5.矢量IO Scatter Gather
Gather: 将多个缓冲区的数据顺序抽取
Scatter: 将数据按顺序散布到多个缓冲区
GatheringByteChannel
ScatteringByteChannel
ByteBuffer buf1 = ByteBuffer.allocate(15000); ByteBuffer buf2 = ByteBuffer.allocate(15000); ByteBuffer[] pool = {buf1, buf2}; File file = new File("/data/2013101112.png"); FileInputStream in = new FileInputStream(file); ScatteringByteChannel channel = in.getChannel(); channel.close(); channel.read(pool); System.out.println(buf1.position()); System.out.println(buf2.position()); buf1.flip(); buf2.flip(); File fileBak = new File("/data/2013101112_bak.png"); if(!fileBak.exists()) { fileBak.createNewFile(); } FileOutputStream out = new FileOutputStream(fileBak); GatheringByteChannel gChannel = out.getChannel(); gChannel.write(pool); gChannel.close(); out.close();
6.FileChannel
总是阻塞的,文件IO的强大在于异步IO,FileChannel属于线程安全的
掌握锁的使用和概念 lock tryLOck
掌握内存映射文件 map
7.Socket通道
SocketChannel ServerSocketChannel DatagramChannel
非阻塞式
ServerSocketChannel sc = ServerSocketChannel.open(); sc.socket().bind(new InetSocketAddress("127.0.0.1", 9069)); sc.configureBlocking(false); ByteBuffer buf = ByteBuffer.wrap("hello channel".getBytes()); while(true) { SocketChannel channel = sc.accept(); if(channel == null) { Thread.sleep(1000); } else { System.out.println("FROM " + channel.getRemoteAddress()); buf.rewind(); channel.write(buf); channel.close(); } }
ByteBuffer buf = ByteBuffer.allocate(2048); System.out.println(buf.capacity()); System.out.println(buf.limit()); SocketChannel sc = SocketChannel.open(); sc.configureBlocking(false); sc.connect(new InetSocketAddress("127.0.0.1", 9069)); sc.configureBlocking(false); while (!sc.finishConnect()); // sc.read(buf); sc.close(); System.out.println(buf.limit()); buf.flip(); while (buf.hasRemaining()) { System.out.println(); }
相关推荐
Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) ...
NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据量的系统。Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 ...
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Java NIO: Non-blocking IO(非阻塞IO) Java NIO...
通过Selector,Java NIO可以同时监听多个通道的事件。当某个通道有数据可读或可写时,Selector会通知用户程序,避免了为每个连接创建单独线程的开销。 **NIO框架分析:** 在实际开发中,我们通常会使用一些NIO框架...
### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...
1. **Selector(选择器)**:选择器是NIO的核心组件,它能够监控多个通道(Channel)的状态变化,当某个通道准备进行读写操作时,选择器会通知用户线程。这样,一个线程就可以管理多个通道,实现多路复用。 2. **...
而Java NIO引入了选择器(Selector)和通道(Channel)的概念,允许单个线程同时处理多个连接,大大提高了系统在高并发环境下的性能。 本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何...
在NIO中,我们不再像BIO那样等待一个操作完成,而是通过选择器(Selector)监控多个通道(Channel),从而实现多路复用。 在Java NIO中,核心组件包括以下几个: 1. **通道(Channel)**:类似于流,但支持双向...
NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。下面将对这些组件进行详细阐述: 1. **通道(Channel)**: 通道是数据传输的载体,类似于传统I/O中的流。Java NIO提供了多种类型的...
Java NIO的核心组件包括Channel(通道)、Buffer(缓冲区)和Selector(选择器)。 - **Channel**:通道用于连接源和目的地,支持数据的读写操作。与传统的流不同,通道支持双向通信,并且可以通过非阻塞的方式进行...
在Java传统IO中,数据的读写都是通过流来完成,而NIO则引入了通道(Channel)和缓冲区(Buffer)的概念,提供了一种非阻塞的I/O操作方式,极大地提高了Java进行并发I/O处理的能力。 首先,我们来看下NIO的核心组件...
传统的Java IO基于流(Stream)并且是阻塞的,而NIO则是基于通道(Channel)和缓冲区(Buffer)的,并且是非阻塞的。NIO的核心组件包括通道、缓冲区和选择器,这些组件共同构建了一种更灵活、更高效的数据传输模型。 1. *...
### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...