NIO 网络通信
NIO
概念理解:
1.送什么货物:FileInputStream fis = new FileInputStream(“C:\reset.css”);
2.货物送到哪里:FileOutputStream fos = new FileOutputStream(“D:\reset.css”);
3.需要接收货物的快递员:FileChannel fisChannel = fis.getChannel();
4.到达目的城市需要快递员送到手里:FileChannel fosChannel = fos.getChannel();
5.需要车辆来承载这些货物。定义这个车能装多少货物:ByteBuffer buffer = ByteBuffer.allocate(1024);
6.执行需要的元素,每次送完一车那么把车标为空车:buffer.flip();
核心部分组成:
1.Channels:通道 Buffer:缓冲区 Selectors :选择器
2.Channels和Buffer是新IO中的两个核心对象,Channel是对传统的输入/输出系统的模拟,在新IO系统中所有的数据都需要通过通道传输。
3.Channels与传统的InputStream,OutputStrem最大的区别在于它提供了一个map()方法,通过该map()方法可以直接将"一块数据"映射到内存中,如果说传统的输入/输出系统是面向流处理,则新IO则是面向块的处理
4.Buffer可以被理解为一个容器(缓冲区,数组),发送到Channel中的所有对象都必须首先放到Buffer中,而从Channel中读取的数据也必须放到Buffer中,也就是说数据可以从Channel读取到Buffer中,也可以从Buffer写到Channel中
5.使用Buffer:Buffer就像一个数组,它可以保存多个类型相同的数据,Buffer是一个抽象类其最常用的是ByteBuffer,它可以在底层字节数组上进行get/set操作,除了ByteBuffer之外,对应于其他基本的数据类型都有相应的Buffer类
NIO于IO的区别:
1.IO面向流,NIO面向缓冲区:—IO面向流意味着每次从流中读取一个或多个字节,直至读取所有字节,他们没有被缓存在任何地方。此外,它不能前后移动流中的数据,如果需要前后移动流中的数据,需要将它缓存到一个缓冲区;NIO的缓冲导向方法略有不同,数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。
2.IO是阻塞式的,NIO由非阻塞式的:—Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。
3.IO没有选择器,NIO有选择器ÿ