Java中的NIO和IO的比较

2023-11-03

        java标准的I/O中,提供了基于流的I/O实现,即InputStream和OutputStream。这种基于流的实现以字节为单位处理数据。

        NIO在java 1.4中被纳入到了JDK中,与旧式的的基于流的I/O相比,NIO是基于块的,以块为单位处理数据。NIO有两个重要的组件缓冲(Buffer)和通道(Channel)。

        Buffer:缓冲是一块连续的内存块,是NIO读写数据的中转池。

        Channel:通道主要用于向缓冲读取和写入数据,是访问缓冲的接口。

       NIO是为了弥补IO操作的不足,NIO的一些新特性有:非阻塞I/O,缓冲,管道以及选择器。管道(Channel),缓冲(Buffer) ,选择器( Selector)是其主要特征。

Buffer和Channel:

    在NIO的实现中,Buffer是一个抽象类。JDK为每一种java基本数据类型(除了Boolean)提供了缓冲区类型。    

缓冲区类型
缓冲区类型 基本数据类型
ByteBuffer byte
CharBuffer char
ShortBuffer short
IntBuffer int
LongBuffer long
FloatBuffer float
DoubleBuffer double

在NIO中,Buffer必须配合Channel使用。比如在读取一个channel的时候,需要先将数据写入到相应的Buffer,然后再Buffer中读取。

以一个读文件为例:

// 首先将文件打开,取得文件的Channel:
FileInputStream  inputStream = new FileInputStream ( new File( "d:\\temp_buffer.txt"));
FileChannel fc = inputStream.getChannel();

// 要从文件Channel中读取数据,必须使用Buffer.
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
fc.read(byteBuffer);

// 此时,文件内容以及存在于Buffer中,准备读取ByteBuffer.
byteBuffer.flip();

Buffer的基本原理:

Buffer有三个重要的参数:位置(position)、limit(上限)、capacity(容量)。

Buffer参数的含义
参数 写模式 读模式
位置(position) 当前缓存区的位置,将从position的下一个位置写数据 当前缓冲区读取的位置,将从此位置后,读取数据
capacity(容量) 缓存区的总容量上限 缓存区的总容量上限
limit(上限) 通常情况下,和容量相同。小于等于容量 可读取的总容量,和上次写入的数据量相等

Buffer的创建:

    Buffer的创建有两种方式:

        1.静态allocate()从堆中分配缓冲区

        2.从一个既有数组中创建缓冲区

//  从堆中分配
ByteBuffer buffer = ByteBuffer.allocate(1024);

//  从既有数组中创建
byte[] array = new byte[1024];
ByteBuffer buffer = ByteBuffer.wrap(array);

重置缓冲区:

    Buffer提供了重置Buffer的函数。

public  final  Buffer flip()
    函数flip()先将limit设置到position所在位置,然后将position置零,并清除标志位mark。通常在读写转换时使用。


NIO和传统的IO有什么区别呢?

1、IO是面向流的,NIO是面向块(缓冲区)的。

    IO面向流的操作一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。,导致了数据的读取和写入效率不佳;

    NIO面向块的操作在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多,同时数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。

    通俗来说,NIO采取了“预读”的方式,当你读取某一部分数据时,他就会猜测你下一步可能会读取的数据而预先缓冲下来。

2、IO是阻塞的,NIO是非阻塞的。

    对于传统的IO,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。

    而对于NIO,使用一个线程发送读取数据请求,没有得到响应之前,线程是空闲的,此时线程可以去执行别的任务,而不是像IO中那样只能等待响应完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的NIO和IO的比较 的相关文章

  • 使用 java 从 XML 元素中删除空格

    我有一个 JSON 如下 String str Emp name JSON Emp id 1 Salary 20997 00 我想使用 java 将此 JSON 转换为 XML 我的 java 代码在这里 JSON json JSONSer
  • 无法禁用 Firestore 中的离线数据

    从我的数据中删除数据后Firestore Database 这需要我的Android app一段时间后才意识到数据已被删除 我认为这是由于自动数据缓存而发生的 我的应用程序与离线使用无关 我想禁用此功能 我已将其添加到我的自定义中Appli
  • 使用 ScriptEngine 从 JavaScript 调用 Java 方法

    我正在使用 ScriptEngine 运行 JavaScript 我希望 JavaScript 脚本能够调用 myFunction 其中 myFunction 是我的给定类中的一个方法 我知道可以将 importPackage 用于标准 J
  • Android 服务 START_STICKY START_NOT_STICKY

    我需要让我的服务始终在后台运行 并使用 startService 函数启动我的服务 无论应用程序的状态如何 我都不想重新启动服务 这是我的观察 START STICKY gt 如果应用程序启动 则服务正在重新启动 当应用程序关闭时 服务也会
  • rmi类找不到异常

    我使用 java rmi 编写了一个简单的项目并导出到可执行 jar 文件 当我尝试运行它时 有时会出现异常 有时会起作用 当我指定 Djava rmi server codebase file serverClasses 时 它似乎没有正
  • 如何用 Java 制作 Windows 7 工具提示

    我一直在网上到处寻找 但没有找到这个小问题的答案 在 Windows 7 中 我认为在 Vista 中 您有一个漂亮的圆形银色工具提示 它看起来比旧的黄色盒装蹩脚工具提示要好得多 下面的 How do I make a Windows 7
  • Cognito SRP 身份验证 JAVA SDK

    我正在尝试使用 Cognito 验证 Java 应用程序 我在Python中使用了warrant库 效果非常好 但我现在想在java中做同样的事情 我的 Python 函数用于身份验证warrant https github com cap
  • Java TCP Echo 服务器 - 广播

    我有一个简单的回显服务器 我希望当连接的用户向服务器键入任何内容时 所有其他客户端和该客户端都会收到消息 MOD 它现在不会发送给所有客户端 但它应该发送 而且我只是不知道我的代码出了什么问题 所以现在它只会将消息 MOD 发送给发送消息的
  • Runtime.getRuntime().exec(cmd) 挂起

    我正在执行一个命令 该命令返回文件的修订号 文件名 但如果执行命令时出现问题 应用程序就会挂起 我可以做什么来避免这种情况 请在下面找到我的代码 String cmd cmd C si viewhistory fields revision
  • 当我打印出数组列表的索引时如何删除最后一个逗号[重复]

    这个问题在这里已经有答案了 List
  • 不带破折号的 CliBuilder 参数

    使用 Groovy CliBuilder 理想情况下我希望有一个命令行 如下所示 MyProgram groovy CommandName arg1 arg2 arg3 是否可以使用 CliBuilder 解析提取 CommandName
  • CompletableFuture SupplyAsync

    我刚刚开始探索 Java 8 的一些并发特性 让我有点困惑的一件事是这两个静态方法 CompletableFuture
  • Apache Camel - 路由中的事务

    我有一个关于 Apache Camel 的一般性问题 我无法找到聚合器是否已进行交易 如果是交易 交易是如何实现的 聚合的速度有多快 将消息发送到聚合器可以在事务中运行 您需要一个带有聚合器的持久存储来让传出消息充当事务 请参阅有关持久性的
  • 如何使用 Java Streams API 将 Map 列表与列表值合并?

    我怎样才能减少Map
  • GSSAPI 中的 javax.naming.AuthenticationException

    我正在尝试使用 JAVA GSSAPI 执行 NTLM 绑定 我收到此错误 javax naming AuthenticationException GSSAPI 根异常是 javax security sasl SaslException
  • CXF 增加连接池大小而不更改 http.maxConnections

    最近我被要求将 CXF 配置为与我们旧的 XFire 服务相同的参数 这些参数之一是Keep Alive timeout 60 max 20 然而 我做了一些研究 看来 CXF 使用 JVMHttpURLConnection引擎盖下的对象
  • 将 JPanel 添加到 JFrame

    我有一个程序 其中将 JPanel 添加到 JFrame public class Test Test2 test new Test2 JFrame frame new JFrame Test frame setLayout new Bor
  • 尝试用Java实现基于文本的Hangman游戏

    我需要检查用户输入的字母以及他们猜测的空格是否位于隐藏单词的特定位置 变量one等于用户猜测的空间索引 而letterGuess是他们猜测的字母 我的代码怎么错了 示例 秘密词是你好 hidden word is 用户猜测h 0 1 2 3
  • 让 subclipse 在 Ubuntu 64 和 Indigo 上工作 - 加载了不兼容的 JavaHL 库。需要 1.7.x 或更高版本

    我该如何解决 我在 ubuntu 64 上使用 Eclipse indigo 我安装了http subclipse tigris org update 1 8 x http subclipse tigris org update 1 8 x
  • Java Media API:java media api 下载

    我在哪里可以找到javax media jar 文件 在sun站点它下载一个安装程序 有没有可用的java媒体jar 没有 javax media 具体是 jar 文件 该包位于 jmf jar 文件中 您需要运行安装程序并取出 jar 或

随机推荐

  • Linux中vim下方向键变成ABCD,backspace无法删除字符的解决办法

    在linux中安装完VIM后 发现在insert模式下 按下四个方向键在屏幕中会输出ABCD这样的字符 并且Backspace无法实现删除功能 虽然可以在normal模式下通过hjkl实现光标的移动 通过x和d实现删除功能 但是每次都要进行
  • 【Python编程】删除列表中具有连续重复项的元素

    删除列表中具有连续重复项的元素 输入 1 1 1 1 1 1 2 3 4 4 5 1 2 输出 1 2 3 4 5 1 2 方法1 循环遍历 a 1 1 1 1 1 1 2 3 4 4 5 1 2 i 0 while i lt len a
  • 如何成为一名AI人工智能算法工程师?

    https www toutiao com a6707050434688713227 经常有朋友私信问 如何学python呀 如何敲代码呀 如何进入AI行业呀 正好回头看看自己这一年走过的路 进行一次经验总结 来看看你距离成为一名AI工程师
  • 时序预测:MATLAB实现时间序列回归之Bootstrapped测试

    时序预测 MATLAB实现时间序列回归之Bootstrapped测试 时序预测是实际应用中非常重要的任务 它在金融 企业经营 气象预测等领域都有广泛的应用 而时间序列回归也是时序预测中最为基础和实用的方法之一 本文将通过MATLAB对时间序
  • 【QT实战】第一章 QT实现画板工具的制作

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏目录 零基础学QT 文章导航篇 专栏资料 https pan baidu com s 192A28BTIYFHmixRcQwmaHw 提取码 qtqt 点
  • c++ 学习之 构造函数的使用规则

    上规则 默认情况下 c 编译器至少给一个类添加三个函数 1 默认构造函数 无参 函数体为空 2 默认析构函数 无参 函数体为空 3 默认拷贝函数 对其属性进行值拷贝 构造函数调用规则 如果用户定义有参构造函数 c 不再提供默认无参构造函数
  • android自定义数字键盘

    前言 最近需要做一个自定义的数字键盘 开始使用了下系统自带的KeyBoardView 但是发现UI效果不是很理想 最后还是自己画一个自定义键盘 这样在UI方面更加方便 先看效果图吧 思路 1 键盘4行 3列的布局分为12个单元格 6条直线分
  • 【神经网络学习】鸢尾花分类的实现

    目录 1 问题 2 问题解决思路 3 神经网络理论准备 4 Tensor Flow编程基础 5 鸢尾花分类神经网络实现 1 问题 鸢尾花分为 狗尾草鸢尾 杂色鸢尾 弗吉尼亚鸢尾 通过测量 花萼长 花萼宽 花瓣长 花瓣宽 这四个参数得出鸢尾花
  • PCB的3D模型的一些工具

    stp转 step的工具 免费将 STP 转换为 STEP ImageToStl
  • Windows 修改 cmd 命令行窗口字符编码

    查看当前 cmd 命令行窗口字符编码 已经是UTF 8 如果要修改为UTF 8 打开注册表 WIN R输入 regedit 回车 找到 HKEY LOCAL MACHINE SOFTWARE Microsoft Command Proces
  • WMS仓储管理系统在各种行业中,都有哪些作用

    由计算机控制的仓库管理系统的目的是独立实现仓储管理各种功能 收货 在正确的地点存货 存货管理 订单处理 分拣和配送控制 WMS仓储管理系统将关注的焦点集中于对仓储执行的优化和有效管理 同时延伸到运输配送计划 和上下游供应商客户的信息交互 从
  • python PDB调试

    1 python m pdb py 从第一行开始pdb调试 2 断点设置 在某一行插入 import pdb pdb set trace 3 常用命令 n ext 下一步 s tep 进入函数 c ontinue 继续到下一个断点 l is
  • 如何计算:结构体内存的大小(在结构体的考察中占据非常重要的地位)

    在之前的文章中 笔者就结构体的简单定义 初始化 等内容 进行了简单描述 但是 对于int double float char 等类型都有自己的大小 但是 对于一个结构体 它的大小该如何计算呢 确实是一个疑问 这个也是不少老铁 在刚学结构体时
  • Vinted、PoshMark、Carousell这些海外二手跨境电商平台如何运营?

    相信大家都知道 闲鱼 二手交易平台一般来说入驻成本低 运营操作简单 平台流量多 因此也非常适合小型卖家入驻 那么海外的 闲鱼 有哪些呢 如何运营 小编为大家找到了国外热门这些平台 有Vinted Facebook marketplace P
  • Excel实现数据项校验的功能---VBA的编写以及数据有效性的设置

    学习VBA的网址 VBA比较运算符 VBA教程 VBA在Excel中的应用 一 改变符合条件单元格的背景颜色 vba判断不是空 百度知道 测试文件 链接 http pan baidu com s 1o7QsCJo 密码 eni7 1 启用宏
  • 《精通direct3d图形及动画程序设计》学习(7)(2012年12月23日)

    8 1 深度测试 22 56
  • 峡谷之巅显示服务器更新,峡谷之巅更新最新资讯

    英雄联盟峡谷之巅第七赛季之前就结束了 目前这次赛季的结算奖励马上就要发放了 很多玩家还不清楚在哪领取 下面就来为大家详细的介绍一下领取地址 英雄联盟峡谷之巅第六赛季的奖励正式的公布了 这次只要排位赛胜场最多的2000名玩家就可以领取到奥术师
  • SpringMVC 中整合JSON、XML视图一

    原文地址 http blog csdn net ibm hoojo article details 6371647 SpringMVC中整合了JSON XML的视图 可以通过这些视图完成Java对象到XML JSON的转换 转换XML提供了
  • nrm安装后报错 require() of ES modules is not supported.

    报错如下 根据路径打开cli js文件 第九行使用 open 的是CommonJs 规范的包 现在 open v9 0 0 是 ES Module 版本的包 解决方法 npm install g nrm open 8 4 2 save
  • Java中的NIO和IO的比较

    java标准的I O中 提供了基于流的I O实现 即InputStream和OutputStream 这种基于流的实现以字节为单位处理数据 NIO在java 1 4中被纳入到了JDK中 与旧式的的基于流的I O相比 NIO是基于块的 以块为