博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java nio的一点整理(一)
阅读量:6972 次
发布时间:2019-06-27

本文共 1254 字,大约阅读时间需要 4 分钟。

hot3.png

最近看疯狂java讲义整理一下nio。传统io的读写方法都是阻塞式的,自JDK1.4之后,java提供了一系列改进的输入/输出功能,称之为new io(nio)。Channel(通道)和Buffer(缓冲)是nio的2个新对象,channel与InputSteam,outputSteam最大的区别就是提供了一个map方法,通过该map方法可以直接将一块数据映射到内存区域中,如果说传统io是面向流的处理,那么nio是面向“块”的处理。

1.传统io的流对象如图

e31b49dcfabed5de56d53003a0362b383ff.jpg

2.nio的buffer对象

buffer对象有三个概念,容量(capacity),界限(limit),位置(position)

容量(capacity):缓冲区的的容量(capacity)表示该Buffer的最大数据容量。

界限(limit):第一个不应该被读出或者写入的缓冲区位置索引。也就是位于limit后的数据即不可被读,也不可被写

位置(position):用于指明下一个可以被读出的或者写入的缓冲区位置索引

如图:

72ad1b2134732c7fcf9c45ce0b50da7732d.jpg

buffer主要作用是装入数据,然后输出数据。类似传统io中自己创建一个byte[],当buffer装入数据结束后,调用buffer的flip(),该方法将limit设置为position所在位置,并将position设置为0。也就是说flip方法是输出数据做好准备。当buffer输出数据结束后,调用clear()方法,clear不是清空buffer的数据,而是将position设置为0,limit设置为和capacity一样。

下面是测试代码

d128a1c4f89a8cc4a21ea0bbd95b45dffef.jpg

执行结果如下:

8631af2ae7744883fe6137dccf400877bdf.jpg

2.channel对象

channel与传统的流对象很类似,主要由2个区别

1.channel可以将指定文件的部分或者全部映射成Buffer
 2.程序不能直接访问channel中的数据,channel必须与buffer进行交互,pipe.SourceChannel 支持线程之间通信的管道channel
 ServerSocketChannel SocketChannel是tcp协议通信channel, DatagramChannel 是 UDP channel。

可以说 nio必须是channel对象和buffer一起使用

1d369bcc21fd895646c2ac15c2953f40eb1.jpg

如上图代码,只是将一个java代码复制到一个a.txt中。如果使用gbk编码会报错java.nio.charset.MalformedInputException: Input length = 1,因为该源码里面有中文,网上查了一下是因为 中文gbk是2个字节,utf-8是3个字节,意思是多了半个汉字导致这种问题。

传统io去读一个文件的时候,通过while循环去读放入一个字节数组中。nio也可以通过这种方式去读,虽然map()方法把一个文件数据全部映射到buffer中,但是有时候文件有可能会非常大。

如下面代码:

af1b4fe0fe7d5801048ab71f86fa5983525.jpg

 

 

转载于:https://my.oschina.net/u/3721784/blog/2254523

你可能感兴趣的文章
AC日记——潜伏着 openjudge 1.7 11
查看>>
AC日记——过滤多余的空格 1.7 23
查看>>
AC日记——[SCOI2008] 着色方案 bzoj 1079
查看>>
ssh快速登录远程服务器
查看>>
【ADO.NET】3、从TXT中导入数据到数据库
查看>>
MAC MAMP install yaf
查看>>
浅谈spring为什么推荐使用构造器注入
查看>>
Android软键盘的隐藏显示、事件监听的代码
查看>>
jquery 固定行列可编辑表格-jfixed
查看>>
在Arch上安装VSCode的方法
查看>>
hadoop datanode 启动出错
查看>>
微信常用功能总结
查看>>
CSS特效(7)——单行居中,多行居左,超过两行用省略号
查看>>
使用Bower管理依赖以及版本控制
查看>>
SQL系列(十一)—— 函数(function)
查看>>
让你的网站IE8浏览自动用IE7兼容模式
查看>>
[Objective-c基础教程] 第三章
查看>>
Django框架 之 中间件
查看>>
简单理解闭包;
查看>>
结合JDK源码看设计模式——享元模式
查看>>