1. 两数之和[简单] | 刷题打卡
384 2023-04-03 03:25:42
Photo By Instagram sooyaaa
问题 15 上一期中我们一起讨论了 Java 的三大 IO 模型,说到其中的 Non-Blocking IO 就不得不提零拷贝技术,你知道零拷贝技术吗?我的答案
想要弄清楚什么是零拷贝,首先得明确一个问题,这里的拷贝指的是什么?我们这里所描述的 拷贝 指的是在应用程序中将文件从 A 拷贝到 B,其中的 A 和 B 可以是电脑上的磁盘文件,也可以是网络中的文件。像这样的拷贝操作在操作系统中经历了复杂的操作,首先应用程序发起读取文件操作,读取到文件后又发起写入文件操作或者写到网络中去。try (FileInputStream fis = new FileInputStream("sourceFile.txt"); FileOutputStream fos = new FileOutputStream("targetFile.txt")) { byte datas[] = new byte[1024*8]; int len = 0; while((len = fis.read(datas)) != -1){ fos.write(datas, 0, len); }}
使用如上方式进行文件拷贝的内在执行原理就如我们开头的介绍的那样,经过了多次用户态和内核态的切换,并且伴随着耗时的 CPU 拷贝操作,可想而知在遇到大文件拷贝时候效率会比较低下,此时可以考虑使用零拷贝技术。 在Java 1.4 中, FileChannel 的 transferTo 方法即引入了零拷贝技术,让我们来一起看一下,如何使用它来提升性能吧。 RandomAccessFile sourceFile = new RandomAccessFile("sourceFile.txt", "rw");FileChannel fromChannel = sourceFile.getChannel();RandomAccessFile targetFile = new RandomAccessFile("targetFile.txt", "rw");FileChannel toChannel = targetFile.getChannel();fromChannel.transferTo(0, fromChannel.size(), toChannel);
如上我们首先获取 FilleChannel,然后调用 FileChannel 的 transferTo 方法即可实现零拷贝操作。内在执行原理就是使用 sendfile 系统调用,剔除了耗时的 CPU 拷贝操作,同时用户态和内核态的上下文切换也是最少的,当你遇到文件拷贝的性能问题时,你可以考虑一下 FilleChannel。 FileChannel 中还提供了其他的方法,例如 transferFrom 方法,感兴趣的小伙伴可以自己尝试一下。 以上即为本期的主题,小伙伴们是否有疑问呢?欢迎留言和我讨论。 金三银四啦,每天一道题目,让 offer 来得简单点。 感谢你的阅读,我为你准备了一份《高级 Java 面试指南》 ,点击在看,关注公众号,回复 "礼物 " 获取。 武汉加油!中国加油!