nio

Java NIO 简介

北城余情 提交于 2020-03-01 11:46:27
Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。 java bio 和 nio 的主要区别 1- 通道(Channel )与缓冲区(Buffer) Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。 简而言之,Channel 负责传输, Buffer 负责存储 缓冲区(Buffer) ):一个用于特定基本数据类型的容器。由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类。 Java NIO 中的 Buffer 主要用于与 NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。 Buffer 就像一个数组,可以保存多个相同类型的数据。根据数据类型不同(boolean 除外) ,有以下 Buffer 常用子类:  ByteBuffer  CharBuffer  ShortBuffer  IntBuffer 

[JavaEE] NIO与IO的区别

ε祈祈猫儿з 提交于 2020-03-01 09:52:31
nio是new io的简称,从jdk1.4就被引入了。现在的jdk已经到了1.6了,可以说不是什么新东西了。但其中的一些思想值得我来研究。这两天,我研究了下其中的套接字部分,有一些心得,在此分享。 首先先分析下:为什么要nio套接字? nio的主要作用就是用来解决速度差异的。举个例子:计算机处理的速度,和用户按键盘的速度。这两者的速度相差悬殊。如果按照经典的方法:一个用户设定一 个线程,专门等待用户的输入,无形中就造成了严重的资源浪费:每一个线程都需要珍贵的cpu时间片,由于速度差异造成了在这个交互线程中的cpu都用来等 待。 nio套接字是怎么做到的? 其实,其中的思想很简单:轮询。一个线程轮询多个input;传统的方式是:有n个客户端就要有n个服务线程+一个监听线程,现在采取这种凡是,可以仅仅使用1个线程来代替n个服务线程以此来解决。 具体应用例子: 在ftp的控制连接中,因为只有少量的字符命令进行传输,所以可以考虑利用这种轮询的方式实现,以节省资源。 ----------------------------------------------------- Java中的阻塞和非阻塞IO包各自的优劣思考 NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。 反应器(Reactor):用于事件多路分离和分派的体系结构模式 通常的

Java 对象序列化 NIO NIO2 深度解析

大憨熊 提交于 2020-03-01 09:36:50
对象序列化 对象序列化机制允许把内存中的Java对象转换成与平台无关的二进制流,从而可以保存到磁盘或者进行网络传输,其它程序获得这个二进制流后可以将其恢复成原来的Java对象。 序列化机制可以使对象可以脱离程序的运行而对立存在 序列化的含义和意义 序列化 序列化机制可以使对象可以脱离程序的运行而对立存在 序列化(Serialize)指将一个java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该java对象 如果需要让某个对象可以支持序列化机制,必须让它的类是可序列化(serializable),为了让某个类可序列化的,必须实现如下两个接口之一: Serializable:标记接口,实现该接口无须实现任何方法,只是表明该类的实例是可序列化的 Externalizable 所有在网络上传输的对象都应该是可序列化的,否则将会出现异常;所有需要保存到磁盘里的对象的类都必须可序列化;程序创建的每个JavaBean类都实现Serializable; 使用对象流实现序列化 实现Serializable实现序列化的类,程序可以通过如下两个步骤来序列化该对象: 1.创建一个ObjectOutputStream,这个输出流是一个处理流,所以必须建立在其他节点流的基础之上 // 创建个ObjectOutputStream输出流

NIO和IO的区别

偶尔善良 提交于 2020-03-01 09:35:06
(NIO翻译单独拎出来) 当我们开始学习IO和NIO的时候,有个问题:我应该在什么时候使用NIO和IO。在本文中我会尽量简明扼要说明NIO和IO的区别,它们的使用环境,以及它们是怎样影响编程。 NIO 和 IO的最主要的区别 以下是它们的主要区别。然后我会详细讲述。 IO NIO 以流为导向 以缓冲为导向 阻塞IO 非阻塞IO 选择器 Stream Oriented vs. Buffer Oriented java IO 是流导向的,它意味着你能每次从流中读写一个或多个字节。你要怎么处理你读取的字节取决于你,然而,它们没用被缓存。除此之外,你不能向前或者向后移动流中的数据。如果你需要改变数据读取方向。首先你应该把数据缓存到内存中。NIO和IO 最大区别就是这个。 NIO的缓存导线表现得有点不同。数据被读取到缓冲区中,你能向前或者向后读取数据。这使你更加灵活的处理问题。你能向前或者向后读取数据,除此之外,你也需要检测缓冲区是否包含你需要的数据。你需要确定当你从缓冲区读取数据的时候,你应该确保你所读的东西没有被覆盖过。 阻塞和非阻塞IO Blocking vs. Non-blocking IO IO 的所有流处理都是线程阻塞的。这意味着,当一个线程调用读或者写的方法的时候,线程直到数据被读取完或者写入完之前都是阻塞的。这条线程在这端区间里面什么事情也干不了。

NIO(一) -- NIO与IO的区别

好久不见. 提交于 2020-03-01 08:37:37
1.什么是NIO Java NIO (new IO or No blocking IO )是从java 1.4引进的一个新的IO API,可以代替标准的IO API。 注意: NIO与原来的IO 具有相同的作用 和 目的 ,但是使用 方式不同 。 NIO支持面向缓冲区、基于通道的IO操作。NIO将以更高的更加安全的方式进行文件的读写操作。 2.Java NIO与IO的主要区别 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented) 阻塞IO(Blocking IO) 非阻塞IO(Non Blocking IO) (无) 选择器(Selectors) 3.IO模型 可以将IO理解为水管中的水流,传输数据的时候,先需要建立管道,然后面向流进行数据的传输 3.NIO模型 可以将通道理解为火车轨道,缓冲区理解为火车,数据由缓冲区装载,面向缓冲区 来源: CSDN 作者: wangleleb 链接: https://blog.csdn.net/wangleleb/article/details/104575252

Java NIO基础知识整理(一)

社会主义新天地 提交于 2020-03-01 00:28:18
NIO 特性 1、 为原始类提供缓存支持; 2 、字符集编码解码解决方案; 3 、 Channel :一个新的原始 I/O 抽象; 4 、支持锁和内存映射文件的文件访问接口; 5 、提供多路非阻塞式( non-bloking )的高伸缩性网络 I/O 。 Buffer 在基本 I/O 操作中所有的操作都是直接以流的形式完成的,而在 NIO 中所有的操作都要使用到缓冲区处理,且所有的读写操作都是通过缓冲区完成的。缓冲区( Buffer )是一个线性的、有序的数据集,只能容纳某种特定的数据类型。 一个 Buffer 有以下几个属性: 容量( capacity ) :缓冲区能包含的元素的最大数目。 限制( limit ) :第一个无法被写入或读取的元素坐标。 坐标( position ) :下一个要写入或读取的元素的坐标。 更多 Buffer 的属性和方法参考 http://download.oracle.com/javase/6/docs/api/ 。 另外, http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ314_027.htm 上面有一个各种类型的 Buffer 和 byte[] 之间相互转换的模型图,挺有帮助的。 图 1 Buffer 内部结构 看一下一个简单的示例

Netty 系列之 Netty 高性能之道

纵然是瞬间 提交于 2020-02-29 19:27:47
1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用 Netty4 + Thrift 压缩二进制编解码技术,他们实现了 10W TPS(1K 的复杂 POJO 对象)的跨节点远程服务调用。相比于传统基于 Java 序列化 +BIO(同步阻塞 IO)的通信框架,性能提升了 8 倍多。 事实上,我对这个数据并不感到惊讶,根据我 5 年多的 NIO 编程经验,通过选择合适的 NIO 框架,加上高性能的压缩二进制编解码技术,精心的设计 Reactor 线程模型,达到上述性能指标是完全有可能的。 下面我们就一起来看下 Netty 是如何支持 10W TPS 的跨节点远程服务调用的,在正式开始讲解之前,我们先简单介绍下 Netty。 1.2. Netty 基础入门 Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。 作为当前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于 Netty 的 NIO 框架构建。 2. Netty 高性能之道 2.1.

《Netty In Action》第七章 编解码器Codec

廉价感情. 提交于 2020-02-29 16:49:52
源码地址: GitHub 本章介绍 Codec,编解码器 Decoder,解码器 Encoder,编码器 Netty提供了编解码器框架,使得编写自定义的编解码器很容易,并且也很容易重用和封装。本章讨论Netty的编解码器框架以及使用。 7.1 编解码器 Codec 编写一个网络应用程序需要实现某种编解码器,编解码器的作用就是讲原始字节数据与自定义的消息对象进行互转。网络中都是以字节码的数据形式来传输数据的,服务器编码数据后发送到客户端,客户端需要对数据进行解码,因为编解码器由两部分组成: Decoder(解码器) Encoder(编码器) 解码器负责将消息从字节或其他序列形式转成指定的消息对象,编码器则相反;解码器负责处理“入站”数据,编码器负责处理“出站”数据。编码器和解码器的结构很简单, 消息被编码后解码后会自动通过ReferenceCountUtil.release(message)释放,如果不想释放消息可以使用ReferenceCountUtil.retain(message),这将会使引用数量增加而没有消息发布,大多数时候不需要这么做。 7.2 解码器 Netty提供了丰富的解码器抽象基类,我们可以很容易的实现这些基类来自定义解码器。下面是解码器的一个类型: 解码字节到消息 解码消息到消息 解码消息到字节 本章将概述不同的抽象基类,来帮助了解解码器的实现

Java IO: BIO, NIO, AIO

纵然是瞬间 提交于 2020-02-29 14:38:10
BIO, NIO, AIO,本身的描述都是在Java语言的基础上的。 而描述IO,我们需要从三个层面: 编程语言 实现原理 底层基础 从编程语言层面 BIO, NIO, AIO以Java的角度理解: BIO,同步阻塞式IO,简单理解:一个连接一个线程 NIO,同步非阻塞IO,简单理解:一个请求一个线程 AIO,异步非阻塞IO,简单理解:一个有效请求一个线程 BIO 在JDK1.4之前,用Java编写网络请求,都是建立一个ServerSocket,然后,客户端建立Socket时就会询问是否有线程可以处理,如果没有,要么等待,要么被拒绝。即:一个连接,要求Server对应一个处理线程。 public class PlainEchoServer { public void serve(int port) throws IOException { final ServerSocket socket = new ServerSocket(port); //Bind server to port try { while (true) { //Block until new client connection is accepted final Socket clientSocket = socket.accept(); System.out.println("Accepted

java-nio

时光怂恿深爱的人放手 提交于 2020-02-29 11:18:16
javanio可以替换传统的io,对于java 的nio理解,可以联想到io。但是他们也有不一样的地方。 1.传统io和nio区别: 2. Buffer 中的重要概念: Ø 容量 (capacity) : 表示 Buffer 最大数据容量,缓冲区容量不能为负,并且创建后不能更改。 缓冲区其实就是数据组,因为是数组,所以数据容量一旦固定就不能修改了。 Ø 限制 (limit) : 第一个不应该读取或写入的数据的索引,即位于 limit 后的数据不可读写。缓冲区的限制不能为负,并且不能大于其容量。 Ø 位置 (position) : 下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制 Ø 标记 (mark) 与重置 (reset) : 标记是一个索引,通过 Buffer 中的 mark() 方法指定 Buffer 中一个特定的 position ,之后可以通过调用 reset() 方法恢复到这个 position 。 标记、 位置、 限制、 容量遵守以下不变式: 0 <= mark <= position <= limit <= capacity 注意: mark 初始化为 -1 ,表示没有标记过 3.来段代码理解一下 package com.nio.nio; import java.nio.ByteBuffer; import org.junit.Test; /