`

JAVA NIO 通道 channel

阅读更多

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();
		}

 

 

分享到:
评论

相关推荐

    JavaNIO chm帮助文档

    Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) ...

    Java NIO英文高清原版

    NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据量的系统。Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 ...

    java NIO 视频教程

    标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Java NIO: Non-blocking IO(非阻塞IO) Java NIO...

    java NIO技巧及原理

    通过Selector,Java NIO可以同时监听多个通道的事件。当某个通道有数据可读或可写时,Selector会通知用户程序,避免了为每个连接创建单独线程的开销。 **NIO框架分析:** 在实际开发中,我们通常会使用一些NIO框架...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...

    java NIO实例

    1. **Selector(选择器)**:选择器是NIO的核心组件,它能够监控多个通道(Channel)的状态变化,当某个通道准备进行读写操作时,选择器会通知用户线程。这样,一个线程就可以管理多个通道,实现多路复用。 2. **...

    一个java NIO的例子

    而Java NIO引入了选择器(Selector)和通道(Channel)的概念,允许单个线程同时处理多个连接,大大提高了系统在高并发环境下的性能。 本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何...

    Java NIO Socket基本

    在NIO中,我们不再像BIO那样等待一个操作完成,而是通过选择器(Selector)监控多个通道(Channel),从而实现多路复用。 在Java NIO中,核心组件包括以下几个: 1. **通道(Channel)**:类似于流,但支持双向...

    Java NIO测试示例

    NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。下面将对这些组件进行详细阐述: 1. **通道(Channel)**: 通道是数据传输的载体,类似于传统I/O中的流。Java NIO提供了多种类型的...

    java NIO详细教程

    Java NIO的核心组件包括Channel(通道)、Buffer(缓冲区)和Selector(选择器)。 - **Channel**:通道用于连接源和目的地,支持数据的读写操作。与传统的流不同,通道支持双向通信,并且可以通过非阻塞的方式进行...

    JAVA NIO学习网站

    在Java传统IO中,数据的读写都是通过流来完成,而NIO则引入了通道(Channel)和缓冲区(Buffer)的概念,提供了一种非阻塞的I/O操作方式,极大地提高了Java进行并发I/O处理的能力。 首先,我们来看下NIO的核心组件...

    java nio示例代码

    传统的Java IO基于流(Stream)并且是阻塞的,而NIO则是基于通道(Channel)和缓冲区(Buffer)的,并且是非阻塞的。NIO的核心组件包括通道、缓冲区和选择器,这些组件共同构建了一种更灵活、更高效的数据传输模型。 1. *...

    java nio 实现socket

    ### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...

Global site tag (gtag.js) - Google Analytics