首页 / JAVA / Java IO与NIO
Java IO与NIO
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java IO与NIO,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2356字,纯文字阅读大概需要4分钟。
内容图文
![Java IO与NIO](/upload/InfoBanner/zyjiaocheng/848/906453e9a1d44eb8bba7e26e52da6735.jpg)
Linux IO流程
lLinux IO流程:
等待数据准备好(Waiting for the data to be ready)
从内核向进程复制数据(Copying the data from the kernel to the process)
Linux IO模型
l《Unix网络编程》
UNIX网络编程的经典之作
l将I/O模型划分为以下五种类型:
阻塞式I/O模型
非阻塞式I/O模型
I/O复用模型
一次观察多个I/O进程,等待哪个进程好了就调用哪个进程
信号驱动式I/O模型
异步I/O模型
各种I/O模型的比较
同步 vs 异步
- 阻塞式I/O模型
- 非阻塞式I/O模型
- I/O复用
- 信号驱动式I/O
- 异步I/O
lPOSIX标准将同步I/O和异步I/O定义为:
同步I/O操作:导致请求进程阻塞,直到I/O操作完成。
异步I/O操作:不导致请求进程阻塞。
Blocking I/O
Single Thread Server (阻塞模式)
MultiThread Server (非阻塞模式)
新来一个就新建一个线程
非阻塞模式升级,增加线程池处理,线程交付线程池管理
- ServerSocket
- Socket
Java NIO概览——变迁
- NIO = New I/O
- NIO 1: JSR 51
- JDK 1.4引入
- http://jcp.org/en/jsr/detail?id=051
NIO 2: JSR203
- JDK 7
- http://jcp.org/en/jsr/detail?id=203
Java IO vs NIO
Java NIO
- NIO
- Buffers
- Channels
- Selectors
- NIO 2.0
- Update
- New File System API
- Asynchronous I/O
Java NIO 主要由下面3部分核心组件组成:
- Buffer
- Channel
- Selector
Java NIO Buffer
Java NIO Buffer
- 一个 Buffer 本质上是内存中的一块, 可以将数据写入这块内存, 从这块内存获取数据
- java.nio 定义了以下几个 Buffer 的实现
Java NIO Buffer三大核心概念:position、limit、capacity
- 最好理解的当然是 capacity,它代表这个缓冲区的容量,一旦设定就不可以更改。比如 capacity 为 1024 的 IntBuffer,代表其一次可以存放 1024 个 int 类型的值。
- 一旦 Buffer 的容量达到 capacity,需要清空 Buffer,才能重新写入值。
从写操作模式到读操作模式切换的时候(flip),position 都会归零,这样就可以从头开始读写了。
写操作模式下,limit 代表的是最大能写入的数据,这个时候 limit 等于 capacity。
写结束后,切换到读模式,此时的 limit 等于 Buffer 中实际的数据大小,因为 Buffer 不一定被写满了。
java.nio.buffer,缓冲区抽象
ByteBuffer
- 理解capacity、limit、position、mark
- 0 – mark – position – limit – capacity
Direct ByteBuffer VS. non-direct ByteBuffer
Non-direct ByteBuffer
-
HeapByteBuffer,标准的java类
-
维护一份byte[]在JVM堆上
- 创建开销小
Direct ByteBuffer
-
底层存储在非JVM堆上,通过native代码操作
-
-XX:MaxDirectMemorySize=<size>
- 创建开销大
两种类型的ByteBuffer
|
DirectByteBuffer |
HeapByteBuffer |
创建开销 |
大 |
小
|
存储位置 |
Native heap |
Java heap
|
数据拷贝 |
无需临时缓冲区做拷贝 |
拷贝到临时DirectByteBuffer,但临时缓冲区使用缓存。 聚集写/发散读时没有缓存临时缓冲区。 |
GC影响 |
每次创建或者释放的时候 都调用一次System.gc() |
|
内容总结
以上是互联网集市为您收集整理的Java IO与NIO全部内容,希望文章能够帮你解决Java IO与NIO所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。