io类库
java.io类库如此庞大,怎么才能全面系统的掌握它?
相对于其他Java基础知识,大部分程序员对Java I/O可能没那么了解,毕竟平时的工作很少会编写I/O相关的代码,比如读写文件、网络编程等。跟Java容器类似,java.io类库,也非常庞大,如此多类看得眼花缭乱,想要清晰的掌握,需要对其有个系统性的认识。本节,我就带你一块剖析一下java.io类库,给你构建一个java.io类库的全景图。
java.io类库如此庞大,怎么才能全面系统的掌握它?
相对于其他Java基础知识,大部分程序员对Java I/O可能没那么了解,毕竟平时的工作很少会编写I/O相关的代码,比如读写文件、网络编程等。跟Java容器类似,java.io类库,也非常庞大,如此多类看得眼花缭乱,想要清晰的掌握,需要对其有个系统性的认识。本节,我就带你一块剖析一下java.io类库,给你构建一个java.io类库的全景图。
BIO、NIO、AIO三种Java I/O模型的实现原理和区别
Java中的I/O类库除了java.io之外,还包括java.nio。既然已经有了java.io了,为什么还要再开发一个新的java.nio呢?java.nio跟java.io有何区别?在平时的开发中,什么时候使用java.io?什么时候使用java.nio?面试中常被问到的BIO、NIO、AIO又是什么东西?带着这些问题,我们来学习本节的内容:java.nio。
普通的I/O读写流程都存在哪些性能问题?
前两节,我们介绍了IO类库和NIO类库,尽管在平时的业务开发中,我们很少会用到它们,但是,对于一些常用中间件、基础系统,比如Kakfa、RocketMQ、MySQL等,其内部实现涉及大量的文件和网络等I/O读写操作。I/O读写是否高效,直接决定了这些中间件和基础系统的性能,是优化的重中之重。I/O读写的优化方式,也是面试中经常被问及的知识点。
关于高速I/O,我们分两节来讲解。本节,我们介绍普通I/O读写的底层实现原理,让你知道I/O读写慢在哪,下一节,我们介绍提高I/O读写速度的方法,让你知道如何让它快。
mmap和零拷贝是如何提高I/O读写速度的?
上一节,我们介绍了I/O读写的底层实现原理,不管读还是写,即便存在DMA,都需要进行2次数据的拷贝和1次系统调用,而1次系统调用又会导致2次用户态和内核态的上下文切换。这也是普通I/O读写值得优化的地方,本节,我们就讲一讲如何利用mmap和零拷贝技术,来提高I/O读写速度。
mmap(memory-mapped file,内存映射文件)是提高文件读写性能的有效技术。注意,mmap一般用于文件,像网络这种数据未知的I/O设备,不适合使用mmap。