nio

13.Java NIO Pipe 管道

风格不统一 提交于 2020-05-08 02:13:54
一个Java NIO的管道是两个线程间单向传输数据的连接。一个管道(Pipe)有一个source channel和一个sink channel(没想到合适的中文名)。我们把数据写到sink channel中,这些数据可以同过source channel再读取出来。 下面是一个管道的示意图: 一个Java NIO的管道是两个线程间单向传输数据的连接。一个管道(Pipe)有一个source channel和一个sink channel(没想到合适的中文名)。我们把数据写到sink channel中,这些数据可以同过source channel再读取出来。 下面是一个管道的示意图: 创建管道(Creating a Pipe) 打开一个管道通过调用Pipe.open()工厂方法,如下: Pipe pipe = Pipe.open(); 向管道写入数据(Writing to a Pipe) 向管道写入数据需要访问他的sink channel: Pipe.SinkChannel sinkChannel = pipe.sink(); 接下来就是调用write()方法写入数据了: String newData = "New String to write to file..." + System.currentTimeMillis(); ByteBuffer buf = ByteBuffer

interestOps throws IllegalArgumentException

北慕城南 提交于 2020-04-30 07:34:29
问题 I wand send a message to all User in map. for (User u : _userMap.values()) { u.getMessages().add(data); u.getKey().interestOps(SelectionKey.OP_WRITE); } but whene I run this function I see Exception in thread "main" java.lang.IllegalArgumentException this line make error u.getKey().interestOps(SelectionKey.OP_WRITE); getKey() returns SelectionKey, getMessages returns ArrayList, data is a byte[] array with message I read using channel.read(buffer); MORE INFO: In a constructor I make Selector

Java NIO 简介

时光总嘲笑我的痴心妄想 提交于 2020-04-28 18:54:33
第一章:简介 先把事实搞清楚,歪曲是以后的事。 ——马克·吐温 我们谈谈 I/O 吧。别走哇,回来!I/O 其实没那么枯燥。输入/输出问题(I/O)虽谈不上多吸 引人,却很重要。程序员多半把 I/O 等同于疏通下水管道:无疑很重要,没有不行,但要是直接跟 它打交道,就没那么惬意了,搞不好弄得浑身臭哄哄的。本书要讲的可不是管道疏通,但是阅读了 随后章节,您就会知道如何让您的数据流动得稍微顺畅一些。 面向对象的程序设计讲的无非就是封装。封装是个好东西:它分解任务,隐藏实施细节,提高 对象的重复利用率。这样的分解、整合既适用于程序,也适用于程序员。您没准就是一位技艺高超 的 Java 程序员,创建极其复杂的对象,完成惊世骇俗的任务,而对支撑 Java 平台的基本 I/O 概念 却几乎一无所知。本章,我们暂且把封装问题抛在一边,先来看看某些底层 I/O 实施细节,希望有 助于您更好地组织协调各个零部件的 I/O 操作。 1.1 I/O与CPU时间的比较 程序员多半当自个儿是软件大师,设计出精巧的例程,这儿压缩几个字节,那儿解开一个循 环,要不就在别处作些调整,让对象更加牢固。这些事情当然很重要,乐趣也不少,但是代码优化 所带来的回报,可能轻易就被低效的 I/O 所抵销。I/O 操作比在内存中进行数据处理任务所需时间 更长,差别要以数量级计。许多程序员一门心思扑在他们的对象如何加工数据上

14. Java NIO vs IO

时光总嘲笑我的痴心妄想 提交于 2020-04-09 19:49:48
当学习Java的NIO和IO时,有个问题会跳入脑海当中:什么时候该用IO,什么时候用NIO? 下面的章节中笔者会试着分享一些线索,包括两者之间的区别,使用场景以及他们是如何影响代码设计的。 NIO和IO之间的主要差异(Mian Differences Between Java NIO and IO) 下面这个表格概括了NIO和IO的主要差异。我们会针对每个差异进行解释。 IO NIO Stream oriented Buffer oriented Blocking IO No blocking IO Selectors 面向流和面向缓冲区比较(Stream Oriented vs. Buffer Oriented) 第一个重大差异是IO是面向流的,而NIO是面向缓存区的。这句话是什么意思呢? Java IO面向流意思是我们每次从流当中读取一个或多个字节。怎么处理读取到的字节是我们自己的事情。他们不会再任何地方缓存。再有就是我们不能在流数据中向前后移动。如果需要向前后移动读取位置,那么我们需要首先为它创建一个缓存区。 Java NIO是面向缓冲区的,这有些细微差异。数据是被读取到缓存当中以便后续加工。我们可以在缓存中向向后移动。这个特性给我们处理数据提供了更大的弹性空间。当然我们任然需要在使用数据前检查缓存中是否包含我们需要的所有数据

【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)

二次信任 提交于 2020-04-07 10:48:46
一、缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象。所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从缓存里查询,如果存在则返回,如果不存在再从数据库里查询,最后添加到缓存里,然后返回给用户,当然了,接下来又能使用缓存来提供查询功能。 而缓存,一般我们可以分为本地缓存和分布式缓存。 常用的本地缓存有 ehcache、guava cache,而我们一般都是使用 ehcache,毕竟他是纯 Java 的,出现问题我们还可以根据源码解决,并且还能自己进行二次开发来扩展功能。 常用的分布式缓存当然就是 Redis 了,Redis 是基于内存和单线程的,执行效率非常的高。 二、Spring Cache 相信如果要整合缓存到项目中,大家都会使用到 Spring Cache,它不但整合了多种缓存框架(ehcache、jcache等等),还可以基于注解来使用,是相当的方便。 缓存框架的整合在 spring-context-support 中: 缓存注解在 spring-context 中: 当然了,在 Spring 的 context 中没有整合 Redis,但是我们可以在 spring-data-redis 中找到。 但是我们都知道,不管是在 Spring 项目 还是 Spring Boot 中

Netty NIO transport && OIO transport

六眼飞鱼酱① 提交于 2020-04-07 07:16:51
Netty NIO transport && OIO transport OIO transport The OIO transport is a compromise(妥协) in Netty. It builds on the known unified(统一) API but isn t asynchronous(异步) by nature because it uses the blocking java.net implementations under the hood. At first glance, this transport may not look useful to you, but it has its use cases. Because the OIO transport uses the java.net classes internally(内部的), it also uses the same logic that you may already be familiar with if you previously written network applications. When using these classes, you usually have one thread that handles the acceptance of

BIO,NIO,AIO有什么区别

只谈情不闲聊 提交于 2020-04-06 02:47:02
BIO :同步阻塞I/O模型,数据在读取写入时会阻塞在一个线程等待其完成。在活动连接数不是很高(小于单机1000)的情况下,这种模型还是不错的,可以让每个连接专注自己的I/O并且编程模型简单,也不用考虑系统过载、限流等问题。 NIO :同步非阻塞I/O模型,它支持面向缓冲,基于通道的I/O模型。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护;对于高负载、高并发的应用,可以使用NIO的非阻塞模式来开发。 AIO :也就是NIO2,它是异步非阻塞的IO模型。异步IO是基于事件和回调机制实现的,也就是应用操作以后会直接返回,不会阻塞在那里,当后台处理完成,操作系统会通知相应的线程执行后续操作。 来源: oschina 链接: https://my.oschina.net/u/3991724/blog/3213078

Java NIO:NIO概述

夙愿已清 提交于 2020-04-01 10:48:00
以下是本文的目录大纲:   一.NIO中的几个基础概念   二.Channel   三.Buffer   四.Selector   若有不正之处,请多多谅解并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3919162.html 一.NIO中的几个基础概念(转载 http://www.cnblogs.com/dolphin0520/p/3919162.html)  在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器)。   首先从Channel说起吧,通道,顾名思义,就是通向什么的道路,为某个提供了渠道。在传统IO中,我们要读取一个文件中的内容,通常是像下面这样读取的: 1 public class Test { 2 public static void main(String[] args) throws IOException { 3 File file = new File("data.txt"); 4 InputStream inputStream = new FileInputStream(file); 5 byte[] bytes = new byte[1024]; 6 inputStream.read(bytes); 7

NIO(New IO)

為{幸葍}努か 提交于 2020-03-31 10:34:57
前面介绍 BufferedReader 时提到它的一个特征——当 BufferedReader 读取输入流中的数据时,如果没有读到有效数据,程序将在此处阻塞该线程的执行(使用 InputStream 的 read() 方法从流中读取数据时,如果数据源中没有数据,它也会阻塞该线程),也就是前面介绍的输入流、输出流都是阻塞式的输入、输出。不仅如此,传统的输入流、输出流都是通过字节的移动来处理的(即使不直接去处理字节流,但底层的实现还是依赖于字节处理),也就是说,面向流的输入/输出系统一次只能处理一个字节,因此面向流的输入/输出系统通常效率不高。 从 JDK 1.4 开始,Java 提供了一系列改进的输入/输出处理的新功能,这些功能被统称为新IO(New IO,简称NIO),新增了许多用于处理输入/输出的类,这些类都被放在 java.nio 包以及子包下,并且对原 java.io 包中的很多类都以 NIO 为基础进行了改写,新增了满足 NIO 的功能。 Java 新IO概述 新IO和传统的IO有相同的目的,都是用于进行输入/输出,但新IO使用了不同的方式来处理输入/输出,新IO采用内存映射文件的方式来处理输入/输出, 新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了 (这种方式模拟了操作系统上的虚拟内存的概念), 通过这种方式来进行输入/输出比传统的输入

Java NIO SocketChannel+Buffer+Selector 详解(含多人聊天室实例)

◇◆丶佛笑我妖孽 提交于 2020-03-31 05:42:17
一、Java NIO 的核心组件 Java NIO的核心组件包括: Channel(通道),Buffer(缓冲区),Selector(选择器) ,其中Channel和Buffer比较好理解 简单来说 NIO是面向通道和缓冲区的 ,意思就是: 数据总是从通道中读到buffer缓冲区内,或者从buffer写入到通道中。 关于Channel 和 Buffer的详细讲解请看: Java NIO 教程 二、Java NIO Selector 1. Selector简介 选择器提供选择执行已经就绪的任务的能力.从底层来看,Selector提供了询问通道是否已经准备好执行每个I/O操作的能力。Selector 允许单线程处理多个Channel。仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道,这样会大量的减少线程之间上下文切换的开销。 在开始之前,需要回顾一下Selector、SelectableChannel和SelectionKey: 选择器(Selector) Selector选择器类管理着一个被注册的通道集合的信息和它们的就绪状态。通道是和选择器一起被注册的,并且使用选择器来更新通道的就绪状态。当这么做的时候,可以选择将被激发的线程挂起,直到有就绪的的通道。 可选择通道(SelectableChannel)