Channel概述

Channel是一个通道,可以通过它读取和写入数据,通道与流的不同之处在于通道是双向的,流是单向的;NIO中通过channel封装了对数据源的操作,通过channel 我们可以操作数据源,但又不必关心数据源的具体物理结构。在大多数应用中,channel与文件描述符或者socket是一一对应的。Channel用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。channel中所有数据都通过 Buffer 对象来处理。您永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

这些是Java NIO中最重要的通道的实现:

FileChannel:从文件中读写数据

DatagramChannel:通过UDP读写网络中的数据

SocketChannel:通过TCP读写网络中的数据

ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel;

FileChannel介绍

文件通道总是阻塞式的,因此不能被置于非阻塞模式。现代操作系统都有复杂的缓存和预取机制,使得本地磁盘I/O操作延迟很少。网络文件系统一般而言延迟会多些,不过却也因该优化而受益。面向流的I/O的非阻塞范例对于面向文件的操作并无多大意义,这是由文件I/O本质上的不同性质造成的。对于文件I/O,最强大之处在于异步I/O(asynchronous I/O),它允许一个进程可以从操作系统请求一个或多个I/O操作而不必等待这些操作的完成。发起请求的进程之后会收到它请求的I/O操作已完成的通知。

FileChannel对象是线程安全(thread-safe)的。多个进程可以在同一个实例上并发调用方法而不会引起任何问题,不过并非所有的操作都是多线程的(multithreaded)。影响通道位置或者影响文件大小的操作都是单线程的(single-threaded)。如果有一个线程已经在执行会影响通道位置或文件大小的操作,那么其他尝试进行此类操作之一的线程必须等待。并发行为也会受到底层的操作系统或文件系统影响。

FileChannel 使用

1 打开FileChannel

在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputStream或RandomAccessFile来获取一个FileChannel实例。下面是通过RandomAccessFile打开FileChannel的示例:

RandomAccessFile aFile = new RandomAccessFile("D:\\database\\sts-project\\nio\\nio-data.txt", "rw");

FileChannel inChannel = aFile.getChannel();

2、从FileChannel读取数据

调用多个read()方法之一从FileChannel中读取数据。如:

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = inChannel.read(buf);

首先,分配一个Buffer。从FileChannel中读取的数据将被读到Buffer中。然后,调用FileChannel.read()方法。该方法将数据从FileChannel读取到Buffer中。read()方法返回的int值表示了有多少字节被读到了Buffer中。如果返回-1,表示到了文件末尾。

3、向FileChannel写数据

String newData = "New String to write to file..." + System.currentTimeMillis();

ByteBuffer buf = ByteBuffer.allocate(48);

buf.clear();

buf.put(newData.getBytes());

buf.flip();

while(buf.hasRemaining()) {

channel.write(buf);

}

注意FileChannel.write()是在while循环中调用的。因为无法保证write()方法一次能向FileChannel写入多少字节,因此需要重复调用write()方法,直到Buffer中已经没有尚未写入通道的字节。

4、关闭FileChannel

用完FileChannel后必须将其关闭。channel.close()

5、FileChannel的position方法

long pos = channel.position();

channel.position(pos +123);

有时可能需要在FileChannel的某个特定位置进行数据的读/写操作。可以通过调用position()方法获取FileChannel的当前位置。也可以通过调用position(long pos)方法设置FileChannel的当前位置。如果将位置设置在文件结束符之后,然后试图从文件通道中读取数据,读方法将返回-1 —— 文件结束标志。如果将位置设置在文件结束符之后,然后向通道中写数据,文件将撑大到当前位置并写入数据。这可能导致“文件空洞”,磁盘上物理文件中写入的数据间有空隙。

7、FileChannel的truncate方法

可以使用FileChannel.truncate()方法截取一个文件。截取文件时,文件将中指定长度后面的部分将被删除。

8、FileChannel的force方法

FileChannel.force()方法将通道里尚未写入磁盘的数据强制写到磁盘上。出于性能方面的考虑,操作系统会将数据缓存在内存中,所以无法保证写入到FileChannel里的数据一定会即时写到磁盘上。要保证这一点,需要调用force()方法。

force()方法有一个boolean类型的参数,指明是否同时将文件元数据(权限信息等)写到磁盘上。

下面的例子同时将文件数据和元数据强制写到磁盘上;

java nio 关闭channel_JAVA NIO(二)Channel通道相关推荐

  1. java io类型_Java NIO之Java中的IO分类

    前言 前面两篇文章(Java NIO之理解I/O模型(一).Java NIO之理解I/O模型(二))介绍了,IO的机制,以及几种IO模型的内容,还有涉及到的设计模式.这次要写一些更贴近实际一些的内容了 ...

  2. JAVA NIO:NIO与OIO的对比以及Channel通道、Selector选择器、Buffer缓冲区的介绍 高并发

    文章目录 二 Java NIO (一)NIO对比OIO (二)概述三个核心组件 Channel通道 Selector选择器 Buffer缓冲区 (三)Buffer详解 1 Buffer类 2 四个属性 ...

  3. JAVA NIO:NIO与OIO的对比以及Channel通道、Selector选择器、Buffer缓冲区的介绍 //高并发

    文章目录 二 Java NIO (一)NIO对比OIO (二)概述三个核心组件 Channel通道 Selector选择器 Buffer缓冲区 (三)Buffer详解 1 Buffer类 2 四个属性 ...

  4. Java NIO之Channel(通道)

    **Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每节文章末尾有引用列表~ 写在所有文字的前面:作者在此特别推荐Google排名第一 ...

  5. 03. Java NIO Channel 通道

    2019独角兽企业重金招聘Python工程师标准>>> Java NIO Channel通道和流非常相似,主要有以下几点区别: 通道可以度也可以写,流一般来说是单向的(只能读或者写) ...

  6. JAVA NIO编程入门(二)

    一.回顾 上一篇文章 JAVA NIO编程入门(一)我们学习了NIO编程的基础知识,并通过一个小demo实战帮助了解NIO编程的channel,buffer等概念.本文会继续学习JAVA NIO编程, ...

  7. Java NIO 编程:Buffer、Channel、Selector原理详解

    1 Java 中的 I/O模型:BIO.NIO.AIO 1.1 BIO.NIO.AIO概念介绍 I/O 模型简单的理解:就是 用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能. Ja ...

  8. Java NIO系列教程(五) 通道之间的数据传输

    在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. transferFro ...

  9. 95-50-050-java.nio.channels-NIO-NIO之Channel(通道)

    1.世界 Java NIO之Channel(通道) Buffer(缓冲区)介绍 通常来说NIO中的所有IO都是从 Channel(通道) 开始的. 从通道进行数据读取 :创建一个缓冲区,然后请求通道读 ...

最新文章

  1. VirtualBox虚拟机中启用usb3.0却无法显示u盘的解决方法
  2. phxpaxos编译示例
  3. 聊天机器人中的深度学习技术(引言)
  4. ubuntu9.10 安装 eclipse3.5 的问题
  5. 【Rain in ACStar HDU-3340】
  6. leetcode-20-有效的括号
  7. 【计蒜客 - 蓝桥训练】炮台实验(数学期望,期望dp)
  8. Hive 行转列,列传行 - Impala 暂不支持
  9. java 中以||作为split分隔符正确的写法
  10. 这些将在新一年改变你的风控内容
  11. 身在旋涡中的百度外卖,还能否找到接盘者?
  12. linux查看历史命令history
  13. 进入微信企业项目授权回跳之后退出项目需要点击两次(手机的返回主键,回退键)才能正常退出的问题解决
  14. 数据库中的全表扫描,索引扫描,以及相关知识点
  15. 4. Flux.filter与Flux.filterWhen的区别与联系
  16. Django Web框架教学笔记-1
  17. 自己做的上海市公积金贷款计算器
  18. 英文名字大全(女篇)
  19. 脑右下角出现金色小锁,进入系统缓慢,点击应用及各种操作反应缓慢或无反应,严重者电脑不断重启
  20. GORM 基础 -- Associations

热门文章

  1. 动态规划—最长公共子序列LCS及模板
  2. fcm模糊聚类matlab实例_MATLAB图论实例——最短路径
  3. java虚拟机进程_Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行...
  4. onenote 模板_onenote实用?炫酷功能系列篇②:用插件让效率翻倍
  5. 注塑机摆放间距多少合适_垃圾分类盛行,生产塑料环卫垃圾桶的注塑机怎么选?...
  6. python体测成绩数据分析统计服_体测成绩数据分析
  7. Python: 更改Jupyter Notebook默认工作路径?
  8. Python+OpenCV:对极几何(Epipolar Geometry)
  9. 洛谷P4782 2-SAT问题
  10. [2019.1.2]BZOJ2115 [Wc2011] Xor