Java中的IO方式大致分为如下几种
- 普通IO,也叫做BIO,基于流模型的阻塞式IO,相关的类大部分都是InputStream,OutputStream,Reader,Writer下的子类。
- NIO,也是大家认为效率较高的IO方式之一,相关的类有 ByteBuffer,FileChannel等。
- mmap内存映射,这是一种将文件直接映射到内存地址的方式,是一种非常快速的IO方案,相关的类有FileChannel,MappedByteBuffer
但是在分析各种IO方式的优化策略的时,首先至少需要了解一下,使用Java进行一次磁盘读取,到底进行了那些步骤?
标准的一次文件读肯定涉及以下几个拷贝步骤
- 将数据从硬件读取到内核态的内核缓冲区中
- 将内核缓冲区的数据读取到用户态的 JVM 中
此外,底层通过 write 、read 等函数进行 IO 系统调用时,需要传入数据所在缓冲区起始地址和长度,但是由于我们使用的是 Java,Java 中的对象存在 Java 的堆中,由于 GC 的存在,对象在堆中的位置是会不断变动的,所以在用户态的 JVM 和 内核缓冲区之间,还有一个不会被 GC 所干扰的堆外内存区作为缓冲区,所以这里又多了一个拷贝步骤。