汕头seo网站建设,如何上传网站到空间,房产网站案例,网络公司企业网站源码Java IO在工作中其实不常用到#xff0c;更别提NIO了。但NIO却是高效操作I/O流的必备技能#xff0c;如顶级开源项目Kafka、Netty、RocketMQ等都采用了NIO技术#xff0c;NIO也是大多数面试官必考的体系知识。虽然骨头有点难啃#xff0c;但还是要慢慢消耗知识、学以致用哈…Java IO在工作中其实不常用到更别提NIO了。但NIO却是高效操作I/O流的必备技能如顶级开源项目Kafka、Netty、RocketMQ等都采用了NIO技术NIO也是大多数面试官必考的体系知识。虽然骨头有点难啃但还是要慢慢消耗知识、学以致用哈~
以贴近现实的【面试官面试】形式涵盖大部分Java程序员需要掌握的后端知识、面试问题系列博客收录在我开源的JavaGetOffer中会一直完善下去希望收到大家的 ⭐️ Star ⭐️支持这是我创作的最大动力 https://github.com/hdgaadd/JavaGetOffer 文章目录 1. Java NIO1.1 通道和缓冲器1.2 非阻塞IO模型1.3 字符流处理字符 2. Channel和Buffer使用2.1 Buffer2.2 Channel 3. NIO零拷贝未完待续。。。 1. Java NIO 面试官了解过NIO吗 了解的面试官。NIO的出现在于提高IO的速度它相比传统的输入/输出流速度更快。
NIO通过管道Channel和缓冲器Buffer来处理数据可以把管道当成一个矿藏缓冲器就是矿藏里的卡车。
程序通过管道里的缓冲器进行数据交互而不直接处理数据。程序要么从缓冲器获取数据要么输入数据到缓冲器。
1.1 通道和缓冲器 面试官那NIO为什么速度快 是这样的NIO提供了通道和缓冲器这两个核心对象。
1管道Channel
与传统的IO流只能只读或只写的单向流不同NIO通道是双向的也就是说读写操作可以同时进行使得数据的处理效率也更高。
2缓冲器Buffer
传统的输入/输出流一次只处理一个字节而每一次字节读取都是一次系统调用涉及到用户空间和内核空间之间的上下文切换通常来说效率不高。
而NIO采用内存映射文件方式来处理输入/输出Channel通过map()方法把一块数据映射到内存中。程序通过Buffer进行数据交互减少了与原始数据源的直接访问。NIO面向块的处理方式使得效率更高。
1.2 非阻塞IO模型 面试官还有吗 有的。
传统的输入/输出流是同步阻塞IO模型如果数据源没有数据了此时程序将进行阻塞。
而NIO是I/O多路复用模型线程可以询问通道有没可用的数据而不需要在没有数据时阻塞掉线程。
1.3 字符流处理字符 面试官你刚刚说输入/输出流是处理字节字符流不是处理字符吗 不是的。所有数据包括文本数据最终都是以字节形式存储的因为计算机底层只能理解二进制数据。
字符最终也是要转换成字节形式之所以可以在文本文件看到字符是因为系统将底层的二进制序列转换成了字符。
2. Channel和Buffer使用
2.1 Buffer 面试官你具体介绍下Buffer 好的Buffer里有3个关键变量。 capcity表示缓冲器Buffer的最大数据容量。position用来指出下一个可以读出/写入Buffer的索引位置也就是记录指针的作用。limit用来表示在Buffer里第一个不能被读出/写入的索引位置。 另外Buffer还提供了get、put方法来供我们操作数据而使用get/put后position的指针位置也会随之移动。
public abstract byte get();public abstract ByteBuffer put(byte b);2.2 Channel 面试官Channel呢 Channel有常见的3个方法map()、read()和write()。
// 将通道文件的区域直接映射到字节缓冲区中
public abstract MappedByteBuffer map(MapMode mode, long position, long size)// 从此Channel通道读取字节序列到给定缓冲区dst
public abstract int read(ByteBuffer dst)// 将给定缓冲区中src的字节序列写入此Channel通道
public abstract int write(ByteBuffer src)以下是Channel的简单使用代码。
public class TestFileChannel {public static void main(String[] args) {File f new File(D:\\JavaGetOffer\\TestFileChannel.java);try {FileChannel inChannel new FileInputStream(f).getChannel();FileChannel outChannel new FileOutputStream(a.txt).getChannel();MappedByteBuffer buffer inChannel.map(FileChannel.MapMode.READ_ONLY, 0, f.length());outChannel.write(buffer);buffer.clear();CharBuffer charBuffer StandardCharsets.UTF_8.newDecoder().decode(buffer);System.out.println(charBuffer);} catch (IOException ex) {ex.printStackTrace();}}
}3. NIO零拷贝 面试官知道NIO零拷贝吗 是这样的在NIO零拷贝出现之前一个I/O操作会将同一份数据进行多次拷贝。可以看下图一次I/O操作对数据进行了四次复制同时来伴随两次内核态和用户态的上下文切换众所周知上下文切换是很耗费性能的操作。 而零拷贝技术改善了上述的问题。可以对比下图零拷贝技术减少了对一份数据的拷贝次数不再需要将数据在内核态和用户态之间进行拷贝也意味不再进行上下文切换让数据传输变得更加高效。 未完待续。。。
好了今天的分享就先到这我们下期《Java IO系列》继续。 创作不易不妨点赞、收藏、关注支持一下各位的支持就是我创作的最大动力❤️