nio

Java 7 nio list directory with wildcard

匆匆过客 提交于 2020-01-31 22:53:33
问题 I'd like to find a file in a directory using wildcard. I have this in Java 6 but want to convert the code to Java 7 NIO: File dir = new File(mydir); FileFilter fileFilter = new WildcardFileFilter(identifier+".*"); File[] files = dir.listFiles(fileFilter); There is no WildcardFileFilter , and I've played around a bit with globs. 回答1: You can pass a glob to a DirectoryStream import java.nio.file.DirectoryStream; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file

对阻塞,非阻塞,同步,异步的理解

别说谁变了你拦得住时间么 提交于 2020-01-31 22:53:01
对阻塞,非阻塞,同步,异步的理解一直很模糊,看了很多文章,也跟同学讨论了一下,写一下自己的理解,当然这个理解还是局限于自己当前的知识水平。有不对的地方,还请纠正 阻塞: 网上有说法是,阻塞就是这个线程不能干别的了,只能在这里等着。 我觉得这个说法不是很准确,我理解阻塞其实就是进程切换到阻塞态,不能占有CPU,这时候,进程就停止在这个阻塞调用上,不能继续向下执行。 Java的普通I/O就是BIO(Blocking I/O)。 Reads a byte of data from this input stream. This method blocks if no input is yet available. 上面是FileInputStream中的read()的描述,当调用read()时,这个程序的进程会被切换到阻塞态,直到操作系统准备好数据,进程才会切换到就绪态。所以说,This method blocks if no input is yet available. 在操作系统的五种I/O模型中, 阻塞I/O 如下 recvfrom是一个系统调用,这个系统调用并不会立即返回,会等到数据准备完成并且被拷贝到应用程序的缓冲区中,或者出现了一个错误,才会返回。 非阻塞: 有了阻塞的理解之后,就很简单,也就是说这个方法不会使进程被切换到阻塞态。 Java中的NIO(Non

Netty 线程模型

本秂侑毒 提交于 2020-01-31 18:20:47
都说Netty是一款高性的网络框架,很多分布式通讯框架底层都是采用Netty,如:dubbo。所以想了解下Netty是如何做到高性能的。下面是近期的一些学习总结。 netty版本目前有3.x 、 4.x 、 5.x几个版本。下面的源码和总结主要是针对3.x版本。 要了解netty首页需要了解下NIO相关知识。netty是对JDK 的NIO进行了优化改造和封装,使得开发变的更加简单方便。 这里不过多讲解NIO的相关知识,之前也写过一些文章对NIO进行总结,下面给出一个NIO简单的通讯代码(网上找在代码),说明下并发的瓶颈出在哪里。 public class NIOServer { // 通道管理器 private Selector selector; /** * 获得一个ServerSocket通道,并对该通道做一些初始化的工作 * * @param port * 绑定的端口号 * @throws IOException */ public void initServer(int port) throws IOException { // 获得一个ServerSocket通道 ServerSocketChannel serverChannel = ServerSocketChannel.open(); // 设置通道为非阻塞 serverChannel

NIO管道(Pipe)

限于喜欢 提交于 2020-01-31 11:19:44
Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。 @Test public void test1() throws IOException{ //1. 获取管道 Pipe pipe = Pipe.open(); //2. 将缓冲区中的数据写入管道 ByteBuffer buf = ByteBuffer.allocate(1024); Pipe.SinkChannel sinkChannel = pipe.sink(); buf.put("通过单向管道发送数据".getBytes()); buf.flip(); sinkChannel.write(buf); //3. 读取缓冲区中的数据 Pipe.SourceChannel sourceChannel = pipe.source(); buf.flip(); int len = sourceChannel.read(buf); System.out.println(new String(buf.array(), 0, len)); sourceChannel.close(); sinkChannel.close(); } 来源: CSDN 作者: 存在,及合理 链接: https://blog.csdn.net/qq

Java NIO系列之[说在前面的话]

…衆ロ難τιáo~ 提交于 2020-01-31 09:34:22
在开始这个系列文章之前,先聊一些题外话,说说我为什么要写Java NIO这个系列技术文章(不看完会错失一个亿的),因为Java NIO并不像JVM,中间件源码那么有吸引力,但这个技术点是java的基础,好多人开发者不注重基础的学习,而是喜欢做项目,get最新的技术点,其实我以前也是这样的,一味地做项目,总是了解最新的技术,把新技术运用到自己做的项目中,了解新技术本身是非常好的学习习惯,但是忽视了最基础的东西是值得反思的。 其实我很久以前就有写技术文章,写博客的打算,一直迟迟没有产出,一是因为自己比较懒,最重要的是我认为自己的技术还没有到了能够产出高质量文章的程度,如果写博客只是为了记录自己的学习轨迹,以便自己复习的话,我认为完全没有必要发博客,自己做些笔记保存到印象笔记就够了,因为你发了博客,别人就可以搜到你的博客,然而你写的博客没有什么深度,甚至还存在很多的问题,对他人的学习不但没有帮助,反而还会误导读者,这一点我就深有感触,我看过好多人写的博客,写的很乱,没有条理可言,而且好多都有问题的,看到这样的文章真的让人很难受。 还是要重申我的观点,仅代表我个人观点而已,写博客一定要认真,写完要多检查几遍,看看有没有错别字,知识有没有错误的地方,是否经过自己深入的思考。因为知识程度的差距,技术水平的有限,难免会有一些错误,书籍都有错误,何况我们个人的一些博客呢

[Netty学习笔记]一、I/O模型

冷暖自知 提交于 2020-01-30 13:47:49
I/O模型 I/O模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。 Java共支持是三种网络编程模型:BIO/NIO/AIO BIO模型 Java BIO:同步阻塞(传统阻塞型),服务器实现模式是一个连接一个线程,即 客户端有连接请求时服务器端就需要启动一个线程来进行处理。如果这个连接不做任何事情就会造成不必要的线程开销 其中BIO常用的编程对象即 ServerSocket 和 Socket ,分别对应服务端和客户端。 需要了解的是 ServerSocket#accept 方法是阻塞的,没有客户端连接进来会一直阻塞在那里。 InputStream#read也是一个阻塞方法,如果没有内容可读的话,会阻塞在那里 以一个例子,来理解 客户端有连接请求时,服务端会创建一个与之对应的线程,并且这个连接不做任何事情也不会被断开,会造成不必要的线程开销 /** * Created by myk * 2020/1/6 下午2:19 * 使用BIO模型编写一个服务器端,监听6666端口,当有客户端连接时,就启动一个线程与之通讯。 */ public class Server { private static int PORT = 6666 ; public static void main ( String [ ] args ) throws

一个故事讲清楚NIO

試著忘記壹切 提交于 2020-01-30 07:40:32
from : https://www.cnblogs.com/LBSer/p/4853234.html 你应该知道的 RPC原理    在学校期间大家都写过不少程序,比如写个 hello world服务类,然后本地调用下,如下所示。这些程序的特点是服务消费方和服务提供方是本地调用关系。   而一旦踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题: 1)要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用? 2)其它团队要使用我们的新服务,我们的服务该怎么发布以便他人调用?下文将对这两个问题展开探讨。 1 public interface HelloWorldService { 2 String sayHello(String msg); 3 } 1 public class HelloWorldServiceImpl implements HelloWorldService { 2 @Override 3 public String sayHello(String msg) { 4 String result = "hello world " + msg; 5 System.out.println(result); 6 return result; 7 } 8

BIO,NIO与AIO的区别

空扰寡人 提交于 2020-01-29 04:21:15
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持I/O属于底层操作,需要操作系统支持,并发也需要操作系统的支持,所以性能方面不同操作系统差异会比较明显。另外NIO的非阻塞,需要一直轮询,也是一个比较耗资源的。所以出现AIO 背景: 省分短信发送每天都差不多要1000W条上下,遇到特殊节假日和政府通告时量会更大!boss系统中存放的是短信发送内容,而真正完成发送短信指令动作是的华为方做的短厅,这么大的通信量选择了netty来完成数据传输并自定义了一套基于netty的SGIP协议进行通信; 省分boss系统—>短信营业厅(); 基本知识 2.1 TCP/IP网络协议 网上很多有关这个协议的解释,自行google,下面是简单的理解记忆: tcp/ip的3次握手,

Java I/O体系原理

℡╲_俬逩灬. 提交于 2020-01-29 00:20:15
基础概念 在介绍I/O原理之前,先重温几个基础概念: (1) 操作系统与内核 操作系统:管理计算机硬件与软件资源的系统软件内核:操作系统的核心软件,负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,为应用程序提供对计算机硬件的安全访问服务 2 内核空间和用户空间 为了避免用户进程直接操作内核,保证内核安全,操作系统将内存寻址空间划分为两部分:内核空间(Kernel-space),供内核程序使用用户空间(User-space),供用户进程使用 为了安全,内核空间和用户空间是隔离的,即使用户的程序崩溃了,内核也不受影响 3 数据流 计算机中的数据是基于随着时间变换高低电压信号传输的,这些数据信号连续不断,有着固定的传输方向,类似水管中水的流动,因此抽象数据流(I/O流)的概念:指一组有顺序的、有起点和终点的字节集合, 抽象出数据流的作用:实现程序逻辑与底层硬件解耦,通过引入数据流作为程序与硬件设备之间的抽象层,面向通用的数据流输入输出接口编程,而不是具体硬件特性,程序和底层硬件可以独立灵活替换和扩展 I/O 工作原理 1 磁盘I/O 典型I/O读写磁盘工作原理如下: tips: DMA:全称叫直接内存存取(Direct Memory Access),是一种允许外围设备(硬件子系统)直接访问系统主内存的机制。基于 DMA 访问方式,系统主内存与硬件设备的数据传输可以省去CPU

Java NIO读书笔记

孤街醉人 提交于 2020-01-28 09:17:28
一、Java IO与NIO区别: (1)Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers (通道和缓冲区) :标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Asynchronous IO (异步 IO ) :Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。 Selectors (选择器) :Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。 (2) Java NIO 和 IO 的主要区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。 IO NIO Stream oriented Buffer oriented Blocking IO Non blocking IO Selectors 面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节