Java NIO理解与使用

JAVA IO 以及 NIO 理解 由于Netty,了解了一些异步IO的知识,JAVA里面NIO就是原来的IO的一个补充,本文主要记录下在JAVA中IO的底层实现原理,以及对Zerocopy技术介绍。 IO,其实意味着:数据不停地搬入搬出缓冲区而已(使用了缓冲区)。比如,用户程序发起读操作,导致“ syscall read ”系统调用,就会把数据搬入到 一个buffer中;用户发起写操作,导致 “syscall write ”系统调用,将会把一个 buffer 中的数据 搬出去(发送到网络中 or 写入到磁盘文件) 上面的过程看似简单,但是底 阅读详情

Netty的使用或许我们看着官网user guide还是很容易入门的。因为Java nio使用非常的繁琐,netty对java nio进行了大量的封装。对于Netty的理解,我们首先需要了解NIO的原理和使用。所以,我也特别渴望去了解NIO这种通信模式。

官方的定义是:nio 是non-blocking的简称,在jdk1.4 里提供的新api 。Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。 Channel :一个新的原始I/O 抽象。 支持锁和内存映射文件的文件访问接口。 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O 。是不是很抽象?

在阅读《NIO入门》这篇技术文档之后,收获了很多。包括对Java NIO的理解和使用,所以也特别的感谢作者。

首先,还是来回顾以下从这篇文档中学到的要点。

为什么要使用 NIO?
NIO 的创建目的是为了让 Java 程序员可以实现高速 I/O 而无需编写自定义的本机代码。NIO 将最耗时的 I/O 操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。

NIO最重要的组成部分

通道 Channels
缓冲区 Buffers
选择器 Selectors


Buffer 是一个对象, 它包含一些要写入或者刚读出的数据。

在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问 NIO 中的数据,您都是将它放到缓冲区中。
缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。

Channel是一个对象,可以通过它读取和写入数据

看完下面这个例子,基本上就理解buffer和channel的作用了

[java]  view plain  copy
  1. package yyf.java.nio.ibm;  
  2.   
  3. import java.io.*;  
  4. import java.nio.*;  
  5. import java.nio.channels.*;  
  6.   
  7. public class CopyFile {  
  8.     static public void main(String args[]) throws Exception {  
  9.   
  10.         String infile = "c://test/nio_copy.txt";  
  11.         String outfile = "c://test/result.txt";  
  12.   
  13.         FileInputStream fin = new FileInputStream(infile);  
  14.         FileOutputStream fout = new FileOutputStream(outfile);  
  15.         // 获取读的通道  
  16.         FileChannel fcin = fin.getChannel();  
  17.         // 获取写的通道  
  18.         FileChannel fcout = fout.getChannel();  
  19.         // 定义缓冲区,并指定大小  
  20.         ByteBuffer buffer = ByteBuffer.allocate(1024);  
  21.   
  22.         while (true) {  
  23.             // 清空缓冲区  
  24.             buffer.clear();  
  25.             //从通道读取一个数据到缓冲区  
  26.             int r = fcin.read(buffer);  
  27.             //判断是否有从通道读到数据  
  28.             if (r == -1) {  
  29.                 break;  
  30.             }  
  31.             //将buffer指针指向头部  
  32.             buffer.flip();  
  33.             //把缓冲区数据写入通道  
  34.             fcout.write(buffer);  
  35.         }  
  36.     }  
  37. }  

缓冲区主要是三个变量

position
limit
capacity
这三个变量一起可以跟踪缓冲区的状态和它所包含的数据。我们将在下面的小节中详细分析每一个变量,还要介绍它们如何适应典型的读/写(输入/输出)进程。在这个例子中,我们假定要将数据从一个输入通道拷贝到一个输出通道。
Position
您可以回想一下,缓冲区实际上就是美化了的数组。在从通道读取时,您将所读取的数据放到底层的数组中。 position 变量跟踪已经写了多少数据。更准确地说,它指定了下一个字节将放到数组的哪一个元素中。因此,如果您从通道中读三个字节到缓冲区中,那么缓冲区的 position 将会设置为3,指向数组中第四个元素。
同样,在写入通道时,您是从缓冲区中获取数据。 position 值跟踪从缓冲区中获取了多少数据。更准确地说,它指定下一个字节来自数组的哪一个元素。因此如果从缓冲区写了5个字节到通道中,那么缓冲区的 position 将被设置为5,指向数组的第六个元素。
Limit
limit 变量表明还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)。
position 总是小于或者等于 limit。
Capacity
缓冲区的 capacity 表明可以储存在缓冲区中的最大数据容量。实际上,它指定了底层数组的大小 ― 或者至少是指定了准许我们使用的底层数组的容量。
limit 决不能大于 capacity。

缓冲区作为一个数组,这三个变量就是其中数据的标记,也很好理解。


Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。

接下来来看看具体的使用把,我创建了一个直接收消息的服务器(一边接收一边写数据可能对于新手不好理解)

服务端:

[java]  view plain  copy
  1. package yyf.java.nio.test;  
  2.   
  3. import java.net.InetSocketAddress;  
  4. import java.net.ServerSocket;  
  5. import java.nio.ByteBuffer;  
  6. import java.nio.channels.SelectionKey;  
  7. import java.nio.channels.Selector;  
  8. import java.nio.channels.ServerSocketChannel;  
  9. import java.nio.channels.SocketChannel;  
  10. import java.util.Iterator;  
  11. import java.util.Set;  
  12.   
  13. public class NioReceiver {  
  14.     @SuppressWarnings("null")  
  15.     public static void main(String[] args) throws Exception {  
  16.         ByteBuffer echoBuffer = ByteBuffer.allocate(8);  
  17.         ServerSocketChannel ssc = ServerSocketChannel.open();  
  18.         Selector selector = Selector.open();  
  19.         ssc.configureBlocking(false);  
  20.         ServerSocket ss = ssc.socket();  
  21.         InetSocketAddress address = new InetSocketAddress(8080);  
  22.         ss.bind(address);  
  23.         SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT);  
  24.         System.out.println("开始监听……");  
  25.         while (true) {  
  26.             int num = selector.select();  
  27.             Set selectedKeys = selector.selectedKeys();  
  28.             Iterator it = selectedKeys.iterator();  
  29.             while (it.hasNext()) {  
  30.                 SelectionKey sKey = (SelectionKey) it.next();  
  31.                 SocketChannel channel = null;  
  32.                 if (sKey.isAcceptable()) {  
  33.                     ServerSocketChannel sc = (ServerSocketChannel) key.channel();  
  34.                     channel = sc.accept();// 接受连接请求  
  35.                     channel.configureBlocking(false);  
  36.                     channel.register(selector, SelectionKey.OP_READ);  
  37.                     it.remove();  
  38.                 } else if (sKey.isReadable()) {  
  39.                     channel = (SocketChannel) sKey.channel();  
  40.                     while (true) {  
  41.                         echoBuffer.clear();  
  42.                         int r = channel.read(echoBuffer);  
  43.                         if (r <= 0) {  
  44.                             channel.close();  
  45.                             System.out.println("接收完毕,断开连接");  
  46.                             break;  
  47.                         }  
  48.                         System.out.println("##" + r + " " + new String(echoBuffer.array(), 0, echoBuffer.position()));  
  49.                         echoBuffer.flip();  
  50.                     }  
  51.                     it.remove();  
  52.                 } else {  
  53.                     channel.close();  
  54.                 }  
  55.             }  
  56.         }  
  57.   
  58.     }  
  59.   
  60. }  

客户端(NIO):

[java]  view plain  copy
  1. package yyf.java.nio.test;  
  2.   
  3. import java.net.InetSocketAddress;  
  4. import java.nio.ByteBuffer;  
  5. import java.nio.channels.SelectionKey;  
  6. import java.nio.channels.Selector;  
  7. import java.nio.channels.SocketChannel;  
  8. import java.util.Iterator;  
  9. import java.util.Set;  
  10.   
  11. public class NioTest {  
  12.     public static void main(String[] args) throws Exception {  
  13.         ByteBuffer echoBuffer = ByteBuffer.allocate(1024);  
  14.         SocketChannel channel = null;  
  15.         Selector selector = null;  
  16.         channel = SocketChannel.open();  
  17.         channel.configureBlocking(false);  
  18.         // 请求连接  
  19.         channel.connect(new InetSocketAddress("localhost", 8080));  
  20.         selector = Selector.open();  
  21.         channel.register(selector, SelectionKey.OP_CONNECT);  
  22.         int num = selector.select();  
  23.         Set selectedKeys = selector.selectedKeys();  
  24.         Iterator it = selectedKeys.iterator();  
  25.         while (it.hasNext()) {  
  26.             SelectionKey key = (SelectionKey) it.next();  
  27.             it.remove();  
  28.             if (key.isConnectable()) {  
  29.                 if (channel.isConnectionPending()) {  
  30.                     if (channel.finishConnect()) {  
  31.                         // 只有当连接成功后才能注册OP_READ事件  
  32.                         key.interestOps(SelectionKey.OP_READ);  
  33.                         echoBuffer.put("123456789abcdefghijklmnopq".getBytes());  
  34.                         echoBuffer.flip();  
  35.                         System.out.println("##" + new String(echoBuffer.array()));  
  36.                         channel.write(echoBuffer);  
  37.                         System.out.println("写入完毕");  
  38.                     } else {  
  39.                         key.cancel();  
  40.                     }  
  41.                 }  
  42.             }  
  43.         }  
  44.   
  45.     }  
  46. }  

运行结果:

[java]  view plain  copy
  1. 开始监听……  
  2. ##8 12345678  
  3. ##8 9abcdefg  
  4. ##8 hijklmno  
  5. ##2 pq  
  6. 接收完毕,断开连接  



当然,BIO的客户端也可以,开启10个BIO客户端线程

[java]  view plain  copy
  1. package yyf.java.nio.test;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.OutputStream;  
  7. import java.net.InetAddress;  
  8. import java.net.InetSocketAddress;  
  9. import java.net.Socket;  
  10. import java.net.UnknownHostException;  
  11. import java.util.Random;  
  12.   
  13. import yyf.java.test.Main;  
  14.   
  15. public class BioClientTest {  
  16.     public static void main(String[] args) throws Exception {  
  17.         BioClient n = new BioClient();  
  18.         for (int i = 0; i < 10; i++) {  
  19.             Thread t1 = new Thread(n);  
  20.             t1.start();  
  21.         }  
  22.     }  
  23. }  
  24.   
  25. class BioClient implements Runnable {  
  26.     @Override  
  27.     public void run() {  
  28.   
  29.         try {  
  30.             Socket socket = new Socket("127.0.0.1", 8080);  
  31.             OutputStream os = socket.getOutputStream();  
  32.             InputStream is = socket.getInputStream();  
  33.             ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  34.             String str = Thread.currentThread().getName() + "...........sadsadasJava";  
  35.             os.write(str.getBytes());  
  36.             StringBuffer sb = new StringBuffer();  
  37.             byte[] b = new byte[1024];  
  38.             int len;  
  39.             while ((len = is.read(b)) != -1) {  
  40.                 bos.write(b, 0, len);  
  41.             }  
  42.             is.close();  
  43.             os.close();  
  44.             socket.close();  
  45.             System.out.println(Thread.currentThread().getName() + " 写入完毕 " + new String(bos.toByteArray()));  
  46.         } catch (Exception e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.     }  
  50.   
  51. }  
运行结果:

[java]  view plain  copy
  1. ##8 Thread-4  
  2. ##8 ........  
  3. ##8 ...sadsa  
  4. ##7 dasJava  
  5. 接收完毕,断开连接  
  6. ##8 Thread-3  
  7. ##8 ........  
  8. ##8 ...sadsa  
  9. ##7 dasJava  
  10. 接收完毕,断开连接  
  11. ##8 Thread-9  
  12. ##8 ........  
  13. ##8 ...sadsa  
  14. ##7 dasJava  
  15. 接收完毕,断开连接  
  16. ##8 Thread-7  
  17. ##8 ........  
  18. ##8 ...sadsa  
  19. ##7 dasJava  
  20. 接收完毕,断开连接  
  21. ##8 Thread-0  
  22. ##8 ........  
  23. ##8 ...sadsa  
  24. ##7 dasJava  
  25. 接收完毕,断开连接  
  26. ##8 Thread-5  
  27. ##8 ........  
  28. ##8 ...sadsa  
  29. ##7 dasJava  
  30. 接收完毕,断开连接  
  31. ##8 Thread-2  
  32. ##8 ........  
  33. ##8 ...sadsa  
  34. ##7 dasJava  
  35. 接收完毕,断开连接  
  36. ##8 Thread-8  
  37. ##8 ........  
  38. ##8 ...sadsa  
  39. ##7 dasJava  
  40. 接收完毕,断开连接  
  41. ##8 Thread-1  
  42. ##8 ........  
  43. ##8 ...sadsa  
  44. ##7 dasJava  
  45. 接收完毕,断开连接  
  46. ##8 Thread-6  
  47. ##8 ........  
  48. ##8 ...sadsa  
  49. ##7 dasJava  
  50. 接收完毕,断开连接  

当然,这只是一个测试,对于一个服务器,是有读取,也有写出的,这是文档给的一个服务端例子

[java]  view plain  copy
  1. package yyf.java.nio.ibm;  
  2.   
  3. import java.io.*;  
  4. import java.net.*;  
  5. import java.nio.*;  
  6. import java.nio.channels.*;  
  7. import java.util.*;  
  8.   
  9. public class MultiPortEcho {  
  10.     private int ports[];  
  11.     private ByteBuffer echoBuffer = ByteBuffer.allocate(5);  
  12.   
  13.     public MultiPortEcho(int ports[]) throws IOException {  
  14.         this.ports = ports;  
  15.         go();  
  16.     }  
  17.   
  18.     private void go() throws IOException {  
  19.         Selector selector = Selector.open();  
  20.         for (int i = 0; i < ports.length; ++i) {  
  21.             ServerSocketChannel ssc = ServerSocketChannel.open();  
  22.             ssc.configureBlocking(false);  
  23.             ServerSocket ss = ssc.socket();  
  24.             InetSocketAddress address = new InetSocketAddress(ports[i]);  
  25.             ss.bind(address);  
  26.             SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT);  
  27.             System.out.println("Going to listen on " + ports[i]);  
  28.         }  
  29.   
  30.         while (true) {  
  31.             int num = selector.select();  
  32.             Set selectedKeys = selector.selectedKeys();  
  33.             Iterator it = selectedKeys.iterator();  
  34.             while (it.hasNext()) {  
  35.                 SelectionKey key = (SelectionKey) it.next();  
  36.                 if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {  
  37.                     ServerSocketChannel ssc = (ServerSocketChannel) key.channel();  
  38.                     SocketChannel sc = ssc.accept();  
  39.                     sc.configureBlocking(false);  
  40.                     SelectionKey newKey = sc.register(selector, SelectionKey.OP_READ);  
  41.                     it.remove();  
  42.                     System.out.println("Got connection from " + sc);  
  43.                 } else if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {  
  44.                     SocketChannel sc = (SocketChannel) key.channel();  
  45.                     int bytesEchoed = 0;  
  46.                     while (true) {  
  47.                         echoBuffer.clear();  
  48.                         int r = sc.read(echoBuffer);  
  49.                         if (r <= 0) {  
  50.                             sc.close();  
  51.                             break;  
  52.                         }  
  53.                         echoBuffer.flip();  
  54.                         sc.write(echoBuffer);  
  55.                         bytesEchoed += r;  
  56.                     }  
  57.                     System.out.println("Echoed " + bytesEchoed + " from " + sc);  
  58.                     it.remove();  
  59.                 }  
  60.   
  61.             }  
  62.             // System.out.println( "going to clear" );  
  63.             // selectedKeys.clear();  
  64.             // System.out.println( "cleared" );  
  65.         }  
  66.     }  
  67.   
  68.     static public void main(String args[]) throws Exception {  
  69.         int ports[] = new int[] { 8080 };  
  70.         for (int i = 0; i < args.length; ++i) {  
  71.             ports[i] = Integer.parseInt(args[i]);  
  72.         }  
  73.         new MultiPortEcho(ports);  
  74.     }  
  75. }  

现在,我们就写个客户端去跟服务器通信,把发过去的返回来:

[java]  view plain  copy
  1. package yyf.java.nio;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.InetSocketAddress;  
  5. import java.net.SocketAddress;  
  6. import java.nio.ByteBuffer;  
  7. import java.nio.channels.SocketChannel;  
  8.   
  9. import javax.swing.ButtonGroup;  
  10.   
  11. public class NioClient {  
  12.     public static void main(String[] args) throws IOException {  
  13.         SocketChannel socketChannel = SocketChannel.open();  
  14.         SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);  
  15.         socketChannel.connect(socketAddress);  
  16.         String str = "你好a";  
  17.         ByteBuffer buffer = ByteBuffer.wrap(str.getBytes());  
  18.         socketChannel.write(buffer);  
  19.         socketChannel.socket().shutdownOutput();  
  20.       
  21.         buffer.clear();  
  22.         byte[] bytes;  
  23.         int count = 0;  
  24.         while ((count = socketChannel.read(buffer)) > 0) {  
  25.             buffer.flip();  
  26.             bytes = new byte[count];  
  27.             buffer.get(bytes);  
  28.             System.out.println(new String(buffer.array()));  
  29.             buffer.clear();  
  30.         }  
  31.         socketChannel.socket().shutdownInput();  
  32.         socketChannel.socket().close();  
  33.         socketChannel.close();  
  34.     }  
  35. }  


运行结果

server:

[java]  view plain  copy
  1. Going to listen on 8080  
  2. Got connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63584]  
  3. Echoed 7 from java.nio.channels.SocketChannel[closed]  

client:

[java]  view plain  copy
  1. 你好a  
RK3588 MIPI屏幕调试避坑指南:双通道8Lane下DSC压缩屏的花屏、分层问题排查实录 本文详细解析了RK3588平台在双通道8Lane MIPI接口下调试DSC压缩屏时遇到的花屏、分层问题。通过硬件信号完整性检查、软件配置验证及帧数据分析,提供了一套系统化的排查方法,并深入探讨了初始化序列优化和双通道同步机制,帮助工程师高效解决高分辨率屏幕显示异常问题。 阅读详情

相关推荐

滚动时域优化方法

滚动时域优化(Receding Horizon Optimization, RHO),也被广泛称为模型预测控制(Model Predictive Control, MPC),是一种用于动态系统优化和控制的。其核心思想是“在每个当前时刻k,控制器只考虑未来一个(称为“预测时域”或“优化时域”,长度N)内的系统行为。(通过测量或估计得到)。(描述状态如何随输入和干扰变化)。(如果有,可能基于历史数据或假设)。在这个有限的未来时域[k, k+N-1]上,求解一个。这个优化问题的目标是找到一个。

m0_69522810的博客 2289

NIO基础

      tomcat集群的时候,在心跳通讯的时候,默认的接收器是NioReceiver,对NIO的使用是个比较经典的例子,在分析NIO之前,先看自己的一个NIO的小例子,代码:   public class HelloServer { private Selector selector; private ByteBuffer byteBuffer = ByteBuffer.allo...

你的天空 238

Tomcat NIO-NioReceiver

org.apache.catalina.tribes.transport.nio.NioReceiver package org.apache.catalina.tribes.transport.nio; import java.io.IOException; import java.net.ServerSocket; import java.nio.channels.CancelledK

guolong1983811的专栏 528

mipi deskew原理理解

何为skew, 从字面意思看是倾斜了,不对齐了;放在mipi的传输中意思就是clock lane和data lane 及data lane与data lane间出现了相位差;一旦出现相位差,大家采样数据时就可能不在同一个节拍上,会出现传输错误。所以就要做deskew,通过做deskew来使得大家重新对齐,在同一个节奏下传输数据. 一般当data rate高于1.5G时建议开启deskew。

lx123010的专栏 8089

Jetson工业级应用指南:用Orin NX 16GB打造多摄像头AI质检系统

本文详细介绍了如何利用NVIDIA Jetson Orin NX 16GB构建高效的多摄像头AI质检系统,涵盖硬件选型、软件优化及产线部署全流程。通过100 TOPS的AI算力和多路视频处理能力,Orin NX在工业4.0时代展现出卓越的实时缺陷检测性能,特别适合嵌入式AI应用场景。

Pepper的专栏 307

Java NIO使用案例和说明

Java NIO是 JDK 提供的一套新的 I/O API,旨在提供更高效的非阻塞 I/O 操作和更灵活的缓冲区管理。NIO 与传统的 Java I/O API 相比,提供了更好的性能和可扩展性,特别是在处理大量并发连接时。对于需要处理大量并发连接的应用程序,Java NIO 明显优于传统的 Socket 编程。由于它可以使用单个线程管理多个连接,因此减少了线程切换带来的开销。

诸葛小猿 1169

ARM Memory Compiler实战指南:从参数配置到GDSII生成的全流程解析

本文详细解析了ARM Memory Compiler在SRAM设计中的全流程应用,从基础参数配置到GDSII文件生成。涵盖SRAM类型选择、核心参数配置策略、高级优化技巧及TSMC 28nm工艺下的实战案例,帮助IC设计工程师高效实现存储器模块的优化设计。

game4的博客 416

【Java 基础】Java 中 NIO 使用

NIO是Java中的一种非阻塞I/O(Non-blocking I/O)模型,它是Java NIO(New I/O)库的一部分。相对于传统的阻塞I/O模型,NIO提供了更高效的I/O操作方式。

激流丶的博客 3671

现代控制理论(4)——李雅普诺夫稳定性理论

文章目录

wang7301的博客 5万+

PyQt 随笔:信号与槽的两种使用方法:@pyqtSlot 和 connect

在 PyQt 中,信号与槽是实现事件驱动的一种重要机制。通过信号与槽的连接,可以实现对象之间的通信,例如在用户界面中响应按钮点击事件或者数据的变化等。PyQt 提供了两种主要的方法来创建信号与槽的连接:@pyqtSlot 装饰器和 connect 方法。本文将详细介绍这两种方法,并提供相应的源代码示例。在上面的示例中,我们定义了一个名为。

QasdCpp的博客 761

琪琪的片片

wesing2008的专栏 37万+

最全教程cadence建立个人CIS数据库

此时如果你删除office365,再装Access数据库,可以安装上,然后你再装office365,系统又会把Access软件给你删除掉,因为冲突了。可以在自己的电脑上新建CIS库,主要包含下面几个内容:数据库文件,原理图封装,PCB封装,数据手册,另外建议做一个器件命名的说明。allegro在调用封装的时候,是看的.psm文件,而不是.dra文件,因此只要是c0402.psm,那么所有的内容都要保持一致。(1)文件夹不要有中文,不要有空格,否则无法识别,可以参考博主的方式,全部使用英文输入法下划线。

D_Katter的博客 247

Java NIO的理解

概述 Java的NIO是一种的新的Java io机制。这里的NIO就是New IO,而不是Not blocking(非阻塞i)的IO。与传统的Java IO不一样的是,NIO提供了非阻塞状态的IO操作,但是,并不是所有的NIO都是可以非阻塞的,比如NIO中文件流的相关API就是阻塞状态的。 可以认为JavaNIO的操作,只需一个线程,就可以具备处理多个数据流的能力。这点类似Linux系统上的多路IO复用技术,比如redis的实现就是利用了linux的该技术。 Java NIO 由以下几个核心部分组成: B

李维的博客 390

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java中BIO,NIO,AIO的理解

Java中BIO,NIO,AIO的理解 在高性能的I/O体系设计中,有几个概念常常会使我们感到迷惑不解。具体如下: 1什么是同步? 2什么是异步? 3什么是阻塞? 4什么是非阻塞? 5什么是同步阻塞? 6什么是同...

161

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

理解java nio,理解JAVA nio非阻塞

这几天在看JAVA nio相关的东西,网上资料说nio是非阻塞的,我实在理解不到这句话的意思;比如我用nio来复制文件,那一句代码表示非阻塞呢?我冥思苦想,实在想不出。public static void main(String[] args) throws Exception {File src = new File("D:\\tool/iToolsSetup_4.2.0.6.exe");Fil...

weixin_35029527的博客 254

java nio 理解_Java NIO 的个人理解

NIO的简介Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。Java NIO和IO的主要区别先从面向的对象说:IO是面向流(Stream Oriented)NIO面向的是缓冲取(Buffer Oriented)是否阻塞:IO: 阻塞IONIO:是非阻塞IONIO有选择器(Sele...

weixin_29150247的博客 152

理解 java nio

理解 Java NIO: http://www.open-open.com/lib/view/open1371349692734.html 同步与异步、阻塞与非阻塞 理解: 同步与异步 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。而异步是不需要等待被依...

https://vinfai.github.io/ 131

Java中BIO,NIO,AIO的理解

Java中BIO,NIO,AIO的理解 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下:  1 什么是同步?  2 什么是异步?  3 什么是阻塞?  4 什么是非阻塞?  5 什么是同步阻塞?  6 什么是同步非阻塞?  7 什么是异步阻塞?  8 什么是异步非阻塞? 先来举个实例生活中的例子: 如果你想吃

walker lee 6786

深入浅出理解Java NIO

简述JAVA NIO概念与NIO 和 BIO的对比,深入理解NIO的三大核心组件 Channel通道、Buffer缓冲区、Selector选择器和NIO中的reactor模式并附上详细模拟实例代码

xiaoxiya55的博客 499

【Java基础】关于NIO的理解

&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;最近看《Redis设计与实现》的文件事件,回顾了一下I/O多路复用的知识,又接着看了一下之前使用Java NIO的代码,突然有了一点新的理解,在此简单记录一下,但这里并不介绍I/O多路复用,NIO相关的基础知识。关于NIO的相关知识使用等,有需要可参考https://segmentfault.com/a/1190000006824196(直接粘了地址...

YHALcong的博客 267

4.6 深入理解Java NIO

4.6 什么是NIO        java中NIO 的含义就是指new IO,就是和传统IO方式相比另一种替代的方案。        java NIO中应是包含Non-Blocking IO的关系,所以网络上很多观点笔者是不认同的,java NIO包中也有阻塞IO的方法,但和传统IO(阻塞)相比只有New IO(阻塞,非阻塞)中支持了非阻塞的方式。 ### 4.6

刘滨浩的博客 2762

Java中IO、BIO、NIO和AIO的理解

1.相关概念 同步:使用同步时,Java自己处理IO读写。 异步:使用异步时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,完成后OS通知Java处理(回调)。 阻塞:使用阻塞IO时,Java调用会一直阻塞到读写完成才返回。 非阻塞:使用非阻塞IO时,如果不能立马读写,Java调用会马上返回,当IO事件分发器通知可读写时在进行读写,不断循环直到读写完成。 2.基本概念 IO:阻塞IO。 BIO:同步阻塞IO。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器需.

slj821的博客 525

我所理解的Java NIO

科技优家 2017-05-03 15:23 上回介绍了超简易日志类,但他有诸多的局限性,注定了不能作为一个网站的日志类。 那什么样的日志类才能用于网站呢。首先来假设三个场景: 场景1:我的网站perfect,几天产生一个bug你吹呀。 场景2:我的网站大多数时间是perfect的呀,但偶尔几秒钟就有几千个bug产生呀。。。 场景3:我的网站非常多人访问呀,平均每秒都有几十条日志产生。

u011277123的博客 2836

java nio深入理解

初识NIO: 在 JDK 1. 4 中新加入了 NIO( New Input/ Output)类,引入了一种基于通道和缓冲区的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆的 DirectByteBuffer 对象作为这块内存的引用进行操作,避免了在 Java 堆和 Native 堆中来回复制数据。 NIO 是一种同...

北巷东东的专栏 588

怎么理解 Java NIO 里面的 attachment ?

来数据的时候, 再次拿出这个容器, 继续放数据, 那么这个容器怎么可以容易的每次都有数据的时候拿到呢?去读取的, 当有部分数据到达的时候, 它就帮你读取, 读完来的数据之后, 还没读取到。在读操作上, 不去干其它事情, 当来一个字节/字符的时候, 它就读一个, 直到返回。有数据, 就通过它拿到之前装有半成品的容器, 那么可以继续放了., 再次等待它接下来的数据, 那么刚才读取的数据放哪里呢?方法附在上面, 下次当有数据来的时候, 通过。的时候, 读线程直接返回, 是由一个专门的。知道有数据的, 一旦。...

龚小帅的博客 1427
上一篇: 使用PowerDesigner进行数据库设计
下一篇: html5图片展示
CSC_Cockroach
博客等级 码龄10年 7粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值