`
salever
  • 浏览: 254675 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java nio 整理整理

阅读更多

看了看Java的nio类库,整理一下思路。

 

1,Buffer

jdk官方文档上对Buffer的描述为:

Sun 写道
缓冲区是特定基本类型元素的线性有限序列。除内容外,缓冲区的基本属性还包括容量、限制和位置:

缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。

缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。

缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。

对于每个非 boolean 基本类型,此类都有一个子类与之对应。

 

Buffer里面的这个几个变量,控制了buffer的put和get行为,之间的相关关系为:

0 <= 标记 <= 位置 <= 限制 <= 容量

新创建的缓冲区总有一个 0 位置和一个未定义的标记。初始限制可以为 0,也可以为其他值,这取决于缓冲区类型及其构建方式。一般情况下,缓冲区的初始内容是未定义的。

 

几个常见的操作说明:

  • clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。

  • flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。 这个操作尤其在read完buffer以后,使用之前调用一次

  • rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。

 

我们常用的也就是ByteBuffer、CharBuffer了。

 

2,Channel

写道
用于 I/O 操作的连接。

通道表示到实体,如硬件设备、文件、网络套接字或可以执行一个或多个不同 I/O 操作(如读取或写入)的程序组件的开放的连接。

通道可处于打开或关闭状态。创建通道时它处于打开状态,一旦将其关闭,则保持关闭状态。一旦关闭了某个通道,试图对其调用 I/O 操作就会导致 ClosedChannelException 被抛出。通过调用通道的 isOpen 方法可测试通道是否处于打开状态。

 

 

Channel有很多实现,AbstractInterruptibleChannel, AbstractSelectableChannel, DatagramChannel, FileChannel, Pipe.SinkChannel, Pipe.SourceChannel, SelectableChannel, ServerSocketChannel, SocketChannel ,下面演示一下用FileChannel进行文件复制:

 

	/**
	 * Copy file using nio.
	 * @param inFile
	 * @param outFile
	 */
	public static void copyFile(String inFile, String outFile) {
		try {
			FileInputStream in = new FileInputStream(inFile);
			FileOutputStream out = new FileOutputStream(outFile);
			FileChannel cIn = in.getChannel();
			FileChannel cOut = out.getChannel();
			
			ByteBuffer buffer = ByteBuffer.allocate(1024);
			int length = 0;
			while(true){
				buffer.clear();
				length = cIn.read(buffer);
				if(length == -1){
					break;
				}
				buffer.flip();
				cOut.write(buffer);
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 

3,Selector

selector是nio实现非阻塞式通信的核心,它是SelectableChannel 对象的多路复用器。

 

关于selector的介绍,SUN的jdk 文档里面已经有很多了,这里不赘述了,下面演示一下如何使用selector和channel实现非阻塞的网络通信。

 

ServerDemo.java

/**
 * @author
 */
public class ServerDemo {

	public static void main(String[] args) throws Exception {
		boolean readAllready = true;
		Charset charset = Charset.forName("utf-8");
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		ServerSocketChannel ssocketChannel = ServerSocketChannel.open();
		ssocketChannel.socket().bind(new InetSocketAddress(6018));
		LogUtil.info("启动了一个ServerSocketChannel");
		ssocketChannel.configureBlocking(false);
		Selector selector = Selector.open();
		ssocketChannel.register(selector, SelectionKey.OP_ACCEPT);
		LogUtil.info("等待客户端连接......");

		String content = "";
		
		while (selector.select() > 0) {
			Set<SelectionKey> set = selector.selectedKeys();
			for (SelectionKey key : set) {
				SocketChannel channel;
				if(key.isAcceptable()){
					channel = ssocketChannel.accept();
					LogUtil.error("有新的客户端连接:" + channel);
					LogUtil.error("地址是: " + channel.socket());
					channel.configureBlocking(false);
					channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
				}
				
				if(key.isReadable()){
					readAllready = true;
					LogUtil.error("有新的读取");
					channel = (SocketChannel) key.channel();
					channel.read(buffer);
					buffer.flip();
					content = charset.decode(buffer).toString() + "\r\n";
					LogUtil.info("Read from clent <<<<<<<<<<< " + content);
					buffer.clear();
				}
				
				if(key.isWritable()){
					if(readAllready){
						channel = (SocketChannel) key.channel();
						buffer.put(("Write into client >>>>>>>>> " + content).getBytes());
						buffer.flip();
						channel.write(buffer);
						buffer.clear();
						Thread.sleep(1000);
						readAllready = false;
					}

				}
			}
			set.clear();
		}
		LogUtil.info("服务器推出");

	}

}

 

其中LogUtil是一个打印日志的泪类,可以用System.out代替。

 

测试这个服务器,可以自己启动一个连接到6018端口的客户端,比如telnet 本地IP 6018,就可以看到效果了

分享到:
评论

相关推荐

    Java NIO:浅析IO模型_动力节点Java学院整理

    Java NIO:浅析IO模型 Java NIO是Java语言中用于高性能I/O操作的API,理解IO模型是学习Java NIO的基础。本文将从同步和异步的概念开始,然后介绍阻塞和非阻塞的区别,接着介绍阻塞IO和非阻塞IO的区别,最后介绍五种...

    JavaNIO[整理].pdf

    Java NIO,全称为New Input/Output,是Java在JDK 1.4版本中引入的一个新特性,用于替代传统的IO API。NIO的核心在于它提供了非阻塞的I/O操作,提高了I/O性能,特别是在高并发场景下,极大地提升了系统资源利用率。 ...

    2021最新-Java NIO视频教程.txt打包整理.zip

    在"2021最新-Java NIO视频教程.txt打包整理.zip"这个资源中,你可能学习到如何创建和管理通道、缓冲区的使用、选择器的注册与选择、文件系统操作的优化、字符集编码的处理以及如何利用NIO进行网络编程等内容。...

    JAVA NIO学习笔记.docx

    Java NIO(New Input/Output)是Java标准库在JDK 1.4引入的一组新的I/O API,它提供了一种不同于传统IO的高效、非阻塞的I/O操作方式。NIO的核心概念包括Channel、Buffer和Selector,它们共同构建了一个与操作系统...

    JAVA核心面试知识整理.pdf

    Java核心面试知识整理包括了对JVM内存区域、垃圾回收机制、GC算法、JVM类加载机制、Java集合框架以及Java IO/NIO等多个方面的深入讲解。以下是对这些知识点的详细介绍: JVM内存区域:JVM内存区域包括了程序计数器...

    Java常用代码整理

    在"Java常用代码整理"这个主题中,我们可以探讨多个Java编程中的关键知识点,包括基础语法、面向对象特性、异常处理、集合框架、IO流、多线程、网络编程以及实用工具类等。 1. **基础语法**:Java的基础语法包括...

    尚硅谷JAVA基础笔记吐血整理

    【JAVA语言概述】 Java是一种跨平台的面向对象的编程语言,由Sun Microsystems开发,现由Oracle公司维护。它的设计目标是实现“一次编写,到处运行”,通过Java虚拟机(JVM)确保代码在不同操作系统上都能运行。Java...

    Java核心面试知识整理.pdf

    本文档是一份关于Java核心面试知识的整理资料,内容涉及Java虚拟机(JVM)、Java内存模型、垃圾回收机制、Java IO/NIO、Java集合等多个关键知识点。通过对这些知识的梳理,能够帮助Java开发者更好地准备面试,同时也...

    java中的IO整理完整版

    以下是对Java IO的详细整理: 首先,Java中的`File`类是操作文件和目录的基础,它提供了许多方法来创建、删除、重命名文件以及检查文件属性。在案例1中,通过`new File("D:\\hello.txt")`创建了一个`File`对象,...

    JAVA高级知识点整理.rar

    本资料"JAVA高级知识点整理.rar"主要涵盖了多线程、虚拟机、Java IO/NIO以及Java集合框架等核心主题,旨在帮助开发者深入理解Java平台的高级特性和最佳实践。 首先,多线程是Java编程中的重要组成部分,它允许程序...

    1_JAVA核心知识点整理.pdf

    Java核心知识点整理包含了Java编程语言中多个关键领域的内容,这些领域对于Java开发者来说是必须掌握的。以下是根据提供的文件内容整理的知识点: 1. JVM (Java虚拟机) - JVM内存区域包括程序计数器、虚拟机栈、...

    JAVA核心知识点整理——java自学资料.rar

    5. **IO流与NIO**:输入输出流的理解和使用,包括文件操作、网络通信等,以及Java NIO(非阻塞I/O)的概念和应用。 6. **多线程**:线程的创建、同步、死锁等问题,以及Thread、Runnable、ExecutorService等并发...

    JAVA架构知识库整理 PDF版 查阅方便

    Java架构知识库整理PDF版是一份详尽的资源,涵盖了Java开发和架构设计的各个方面,旨在为Java学习者提供一个全面的学习指南。这份文档可能包含了从基础语法、面向对象编程概念,到高级并发处理、内存管理、性能优化...

    Java核心知识整理.pdf

    Java核心知识整理 Java是一种广泛使用的面向对象编程语言,它具有跨平台、对象导向、简单易学等特点。作为Java工程师,需要掌握Java的多方面知识点,包括但不限于JVM(Java虚拟机)原理、Java内存模型、垃圾回收...

    JAVA核心知识点整理.pdf

    从给定文件的标题、描述、标签以及部分内容中整理出的Java核心知识点如下: 首先,标题中的"JAVA核心知识点整理.pdf"说明这份文档是一个关于Java编程语言的核心知识集合,很可能是为了面试准备而编写的资料。描述中...

    JAVA核心知识整理.pdf

    ### JAVA核心知识整理 ...以上内容覆盖了JAVA核心知识整理中的关键知识点,包括JVM的基础知识、垃圾回收机制、引用类型、GC垃圾收集器的选择、IO/NIO模型及其实现、类加载机制以及常见的集合类等。

    JAVA核心面试知识整理

    标题《JAVA核心面试知识整理》指出了整理的内容主要是Java基础知识,对于面试来说,这些基础知识点是必考的核心,掌握这些知识对求职者至关重要。描述中提到“搞懂这些,最起码不会饿死”,暗示这些知识点是Java编程...

    java面试题整理集合

    Java面试题整理集合 在Java领域,面试是评估求职者技术实力的重要环节。这份整理集合涵盖了Java编程语言的基础、进阶、并发、内存管理、框架等多个方面,旨在帮助准备面试的开发者全面了解并掌握Java的核心知识。...

Global site tag (gtag.js) - Google Analytics