Java的NIO与IO的详解及对比
Java的NIO与IO的区别
NIO是JDK1.4引入的异步IO,NIO核心部分就是三点:
- Channel
- Buffer
- Selector
NIO与IO对比
NIO与IO的区别,总体上来说体现在三个方面:
- IO 基于流(Stream oriented), 而 NIO 基于 Buffer (Buffer oriented)
- IO 操作是阻塞的, 而 NIO 操作是非阻塞的
- IO 没有 selector 概念, 而 NIO 有 selector 概念.
基于 Stream 与基于 Buffer
传统的 IO 是面向字节流或字符流的, 而在 NIO 中, 我们抛弃了传统的 IO 流, 而是引入了 Channel 和 Buffer 的概念。在 NIO 中, 我只能从 Channel 中读取数据到 Buffer 中或将数据从 Buffer 中写入到 Channel。
那么什么是 基于流 呢? 在一般的 Java IO 操作中, 我们以流式的方式顺序地从一个 Stream 中读取一个或多个字节, 因此我们也就不能随意改变读取指针的位置。
而 基于 Buffer 就显得有点不同了. 我们首先需要从 Channel 中读取数据到 Buffer 中, 当 Buffer 中有数据后, 我们就可以对这些数据进行操作了。不像 IO 那样是顺序操作, NIO 中我们可以随意地读取任意位置的数据。
阻塞和非阻塞
Java 提供的各种 Stream 操作都是阻塞的, 例如我们调用一个 read 方法读取一个文件的内容, 那么调用 read 的线程会被阻塞住, 直到 read 操作完成。而 NIO 的非阻塞模式允许我们非阻塞地进行 IO 操作.。例如我们需要从网络中读取数据, 在 NIO 的非阻塞模式中, 当我们调用 read 方法时, 如果此时有数据, 则 read 读取并返回; 如果此时没有数据, 则 read 直接返回, 而不会阻塞当前线程。
selector
selector 是 NIO 中才有的概念, 它是 Java NIO 之所以可以非阻塞地进行 IO 操作的关键。通过 Selector, 一个线程可以监听多个 Channel 的 IO 事件, 当我们向一个 Selector 中注册了 Channel 后, Selector 内部的机制就可以自动地为我们不断地查询(select) 这些注册的 Channel 是否有已就绪的 IO 事件(例如可读, 可写, 网络连接完成等)。通过这样的 Selector 机制, 我们就可以很简单地使用一个线程高效地管理多个 Channel 了。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关推荐
-
java 基础知识之IO总结
java 基础知识之IO总结 我计划在接下来的几篇文章中快速回顾一下Java,主要是一些基础的JDK相关的内容. 工作后,使用的技术随着项目的变化而变化,时而C#,时而Java,当然还有其他一些零碎的技术.总体而言,C#的使用时间要更长一些,其次是Java.我本身对语言没有什么倾向性,能干活的语言,就是好语言.而且从面向对象的角度来看,我觉得C#和Java对我来说,没什么区别. 这篇文章主要回顾Java中和I/O操作相关的内容,I/O也是编程语言的一个基础特性,Java中的I/O分为两
-
java IO 字节流详解及实例代码
java IO 字节流详解 1. 如何理解输入输出流? 这是我当初在学习Java IO这一块很难理解的一块,输入输出流我们可必须以一个为参照物:我们以内存为参照物,凡是写入内存的我们叫输入流,从内存中写出的我们叫输出流.看下面的示例图 有了这样的一个概念对于我们再学习Java中的IO流我相信就会变得特别简单了. 2. 再看流的分类 流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕.流分类的方式很多: 1.按照输入的方向分,输入流和输出流,输入输出的参
-
Java IO中字节流复制图片实现代码
Java IO--字节流复制图片实例 字节流用来操作图片.视屏.音频(进制文件) 实例代码: package learn; import java.io.*; public class Learn{ public static void main(String[] args) throws IOException { File file1=new File("D:/a.jpg"); File file2=new File("D:/b.jpg"); byte[] b=
-
java 使用ImageIO.writer从BufferedImage生成jpeg图像遇到问题总结及解决
java 使用ImageIO.writer从BufferedImage生成jpeg图像遇到问题总结及解决 生成jpeg图像这是个非常非常简单的东西了,网上很多介绍是直接用com.sun.image.codec.jpeg.JPEGImageEncoder来实现,如下: /** * 将原图压缩生成jpeg格式的数据 * @param source * @return */ public static byte[] wirteJPEGBytes(BufferedImage source){ if(nu
-
Java的NIO与IO的详解及对比
Java的NIO与IO的区别 NIO是JDK1.4引入的异步IO,NIO核心部分就是三点: Channel Buffer Selector NIO与IO对比 NIO与IO的区别,总体上来说体现在三个方面: IO 基于流(Stream oriented), 而 NIO 基于 Buffer (Buffer oriented) IO 操作是阻塞的, 而 NIO 操作是非阻塞的 IO 没有 selector 概念, 而 NIO 有 selector 概念. 基于 Stream 与基于 Buffer 传统
-
Java 中的io模型详解
1. BIO 我们先看一个 Java 例子: package cn.bridgeli.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * @author bridgel
-
Java NIO Buffer实现原理详解
目录 1.Buffer的继承体系 2.Buffer的操作API使用案例 3.Buffer的基本原理 4.allocate方法初始化一个指定容量大小的缓冲区 5.slice方法缓冲区分片 6.只读缓冲区 7.直接缓冲区 8.内存映射 1.Buffer的继承体系 如上图所示,对于Java中的所有基本类型,都会有一个具体的Buffer类型与之对应,一般我们最经常使用的是ByteBuffer. 2.Buffer的操作API使用案例 举一个IntBuffer的使用案例: /** * @author csp
-
Java中文件的读写方法之IO流详解
目录 1.File类 1.1File类概述和构造方法 1.2File类创建功能 1.3File类判断和获取功能 1.4File类删除功能 2.递归 2.1递归 2.2递归求阶乘 2.3递归遍历目录 3.IO流 3.1 IO流概述和分类 3.2字节流写数据 3.3字节流写数据的三种方式 3.4字节流写数据的两个小问题 3.5字节流写数据加异常处理 3.6字节流读数据(一次读一个字节数据) 3.7字节流复制文本文件 3.8字节流读数据(一次读一个字节数组数据) 3.9字节流复制图片 总结 1.Fil
-
Java并发编程Semaphore计数信号量详解
Semaphore 是一个计数信号量,它的本质是一个共享锁.信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可:当信号量中有可用的许可时,线程能获取该许可:否则线程必须等待,直到有可用的许可为止. 线程可以通过release()来释放它所持有的信号量许可(用完信号量之后必须释放,不然其他线程可能会无法获取信号量). 简单示例: package me.socketthread; import java.util.concurrent.ExecutorService;
-
java 中自定义OutputFormat的实例详解
java 中 自定义OutputFormat的实例详解 实例代码: package com.ccse.hadoop.outputformat; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apa
-
java编程 中流对象选取规律详解
实例如下: import java.io.*; public class TransStreamDemo2 { /** * 流操作的基本规律 * 1. * 源,键盘录入 * 目的.控制台 * 2. * 需求:想把键盘录入的数据存储到一个文件中. * 源:键盘 * 目的:文件(FileoutputStream可以操作文件) * 3. * 需求:想把一个文件的数据打印到控制台上 * 源:某个文件 * 目的:控制台 * * * 流操作的基本规律 * 最痛苦的是流对象很多不知道用哪个 * * 通过两个明
-
Java 虚拟机(JVM)之基本概念详解
1.类加载子系统:负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间. 2.方法区:就是存放类信息.常量信息.常量池信息.包括字符串字面量和数字常量等.方法区是辅助堆栈的块永久区,解决堆栈信息的产生,是先决条件. 3.Java堆:再java虚拟机启动的时候建立Java堆,它是java程序最主要的内存工作区域,几乎所有的对象实例都存放到Java堆中,堆空间是所有线程共享的.堆解决的是数据存储问题,即数据怎么放.放在哪儿. 4.直接内存:Java的NIO库允许Ja
-
Java AtomicInteger类的使用方法详解
首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; } } 以下是AtomicInteger的: public class Sample2 { private static AtomicInteger count = new AtomicIn
随机推荐
- jquery简单实现滚动条下拉DIV固定在头部不动
- 基于jQuery选择器之表单对象属性筛选选择器的实例
- js判断选择的时间是否大于今天的代码
- javascript html实现网页版日历代码
- js根据日期判断星座的示例代码
- PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
- php 去除html标记--strip_tags与htmlspecialchars的区别详解
- 查询优化之EXPLAIN的使用分析
- javascript动画算法实例分析
- php float不四舍五入截取浮点型字符串方法总结
- Ajax缓存问题的解决方法汇总
- CSS文字截取功能实现代码
- C语言获取Shell返回结果的实现方法
- jquery异步跨域访问代码
- Android view随触碰滑动效果
- Java求素数和最大公约数的简单代码示例
- java集合迭代器Iterator中的remove陷阱
- Django基于ORM操作数据库的方法详解
- 对Layer弹窗使用及返回数据接收的实例详解
- 浅析CentOS6.8安装MySQL8.0.18的教程(RPM方式)