前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java NIO 之 FileChannel

Java NIO 之 FileChannel

作者头像
水货程序员
修改2018-11-15 22:51:42
8190
修改2018-11-15 22:51:42
举报
文章被收录于专栏:javathingsjavathings

从 JDK1.4 开始(2002 年发布的),Java 提供了 NIO ,主要包含在 java.nio 软件包及其子包中,并被命名为 New I/O(NIO)距今已经十几年了,其实已经算不得新了。

Java NIO 网上有很多详细的文档和书籍。

NIO 中的 Channel 可以分成 2 类,

  • 一类是阻塞的,只有 FileChannel
  • 一类是非阻塞的(除了 FileChannel),此类一般与 Selector 一起使用,通常是和网络相关的操作。

FileChannel

FileChannel 虽然是阻塞的,但是通常他在性能上有更好的表现。它可以通过 map 方法实现内存映射,直接提升了效率。

操作系统中,把系统的空间分成用户空间和内核空间。所谓内核空间,指的是操作系统所在的区域,里面的操作和操作系统密切相关,属于底层调用,包括和硬件的I/O交互,设置指令,线程调度等操作。而用户空间,就是常规进程所在的区域,JVM就属于常规进程,运行在用户空间。用户空间的操作不能干扰内核空间的操作,所以用户空间不能直接和硬件通信,必须通过内核空间作为中间人。正式由于这种机制,传统的文件I/O不得不在内核空间内核空间拷贝数据。

但是,还有一种操作系统支持的特殊类型的I/O操作,它直接将用户空间中的内存映射到内核空间中的高速缓存页,这种方式省去了内核空间和用户空间之间的数据复制损耗。

下面的代码演示了通过 FileChannel 的 map 方法读取内容。

代码语言:javascript
复制
	public static void demo() throws Exception {
		RandomAccessFile aFile = new RandomAccessFile("c:\\source.txt", "r");
		FileChannel inChannel = aFile.getChannel();
		// map方法映射
		MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
		buffer.load();
		for (int i = 0; i < buffer.limit(); i++) {
			System.out.print((char) buffer.get());
		}
		buffer.clear();
		// 关闭channel
		inChannel.close();
		aFile.close();
	}

原创文章,转载请注明出处!/developer/article/1362837

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com