目录
前言FileChannel新建实现文件的读写本篇文章所有代码前言
在文章NIO 下的 ByteBuffer简单学习 中, 我们有写过一个简单的文件读取案例, 在案例中有使用到 Buffer 和 Channel, 关于 Buffer 的简单使用可以看下面两篇文章
(资料图片仅供参考)
NIO 下的 ByteBuffer简单学习最简单的 NIO 粘包解析与分析关于 Channel 主要分为以下几种, 本篇文章是对 FileChannel 的讲解:
FileChannel: 文件通道, 主要用于对文件的读写DatagramChannel: 数据包通道, 可以发送和接受 UPD 的数据包SocketChannel: 套接字通过, 接收 TCP 数据包的读写ServerSocketChannel: 服务器套接字通道, 监听新进来的 TCP 连接, 为每一个新连接都创建一个 SocketChannelFileChannel
注意: FileChannel 只能工作在阻塞模式下
新建
FileChannel 是一个抽象类, 所以不能直接创建对象
public abstract class FileChannel extends AbstractInterruptibleChannel implements SeekableByteChannel, GatheringByteChannel,ScatteringByteChannel { /** * Initializes a new instance of this class. * */ protected FileChannel(){}
创建一个 FileChannel 有以下三种方式:
创建一个 FileInputStream 对象, 但是该对象获取到的 Channel 只能读取创建一个 FileOutputStream 对象, 但是该对象获取到的 Channel 只能写入创建一个 RandomAccessFile 对象, 该对象能否读写是根据构造 RandomAccessFile 时设置的读写模式设定的注意: Channel 使用之后必须关闭
不主动 close并且 未触发gc, 那么 连接和 句柄将被 一直占用, 如果此时使用的是连接池方式, 将造成连接池中的连接不能及时的被回收问题
在调用 FileInputStream 、 FileOutputStream 和 RandomAccessFile 的 close 方法会间接调用 Channel 的 close 方法
实现文件的读写
通过以下代码可以简单的通过 FileInputStream 和 FileOutputStream 来实现对文件的读写
public static void main(String[] args) { try( FileChannel inputChannel = new FileInputStream( name: "test1.txt").getChannel(); FileChannel outputChannel = new FileOutputStream( name: "test2.txt").getChannel() ){ // inputChannel 流读取到的内容通过 outputChannel 传输到指定的地址 inputChannel.transferTo( position: 0,inputChannel.size(),outputChannel); }catch (Exception e){ e.printstackTrace(); } }
但是这里有个问题, FileChannel 的 transferTo 只能传输 2G 以内的数据, 超过 2G 就传输不了了,
下面是 FileChannel 的 tarnsferTo 方法, 可以看到他是存在返回值的, 这个返回值就代表着还剩下多少字节的内容没有进行传输, 所以我们可以使用一个 for 循环来对当前的代码进行改进
改进后的代码如下所示
public static void main(String[] args) { try( FileChannel inputChannel = new FileInputStream( name: "test1.txt").getChannel(); FileChannel outputChannel = new FileOutputStream( name: "test2.txt").getChannel() ){ //获取到 输入流 的大小 long size = inputChannel.size(); // res 代表剩余多少字节没有进行传输 for (long res = size;res > 0; ){ //将 inputChannel 流读取到的内容通过 outputChannel 传输到指定的地址 // 效率高,底层会利用作系统的 零拷贝 进行优化,但是一次只能传输 2G 的数据 // 该方法返回值为 剩余未传输的 字节数 res = inputChannel.transferTo( position: 0,inputChannel.size(), outputChannel); } }catch (Exception e){ e.printstackTrace(); } }
本篇文章所有代码
public static void main(String[] args) { try( FileChannel inputChannel = new FileInputStream("test1.txt").getChannel(); FileChannel outputChannel = new FileOutputStream("test2.txt").getChannel() ){ // 获取到 输入流 的大小 long size = inputChannel.size(); // res 代表剩余多少字节没有进行传输 for (long res = size; res > 0; ){ // 将 inputChannel 流读取到的内容通过 outputChannel 传输到指定的地址 // 效率高, 底层会利用操作系统的 零拷贝 进行优化, 但是一次只能传输 2G 的数据 // 该方法返回值为 剩余未传输的 字节数 res = inputChannel.transferTo(0, inputChannel.size(), outputChannel); } }catch (Exception e){ e.printStackTrace(); } }
到此这篇关于详解NIO中FileChannel文件流的简单使用的文章就介绍到这了,更多相关FileChannel使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
关键词:
-
详解NIO中FileChannel文件流的简单使用_环球关注
NIO中Channel分为了很多种,包括FileChannel,DatagramChannel,SocketChannel和ServerSocketChannel,其中
-
2023泗水新能源电动车消费券补贴多少钱?_当前消息
2023泗水新能源电动车消费券补贴标准按照新能源电动车销售价格(以机动车销售统一发票上含税价为准,下同)
-
超30人!义乌这个学校公开招聘|信息
01工作人员招聘计划招聘岗位2 报名流程报名时间:公告发布之日起至2023年5月23日16:00止。报名方式:应聘
-
40个优秀案例角逐中国南京首届城市数字化轻应用大赛|焦点速读
5月16日至17日,“中国南京首届城市数字化轻应用大赛”决赛在江苏省南京市建邺区金鱼嘴基金大厦举行。
-
当前热文:营销观察|美依礼芽意外爆红,二次元带飞浪姐
文|窦轩编辑|董洁出圈经常是出乎意料的。谁能想到,这届浪姐第一个爆火的选手,居然是一位来自日本的二
-
“太行泉城、美丽邢台”城市品牌亮相2023中国品牌日-世界快看
■中国品牌建设促进会从全国选出71个品牌产业园示范基地,我市9个县(市、区)位列其中■大会发布了“2023
-
@海南准新人,“5·20”结婚登记“不打烊”!|全球观察
因“520”谐音“我爱你”,5月20日成为每年结婚登记的高峰日之一。记者从海南省民政厅获悉,今年的5月20日
-
【全球播资讯】初学者怎么学口琴(初学者怎样学口琴)
1、学习吹口琴,先要了解孔的吹或吸,能看到铆钉的要吸,能看到簧片的孔要吹。2、看清后,嘴先含一个孔试着
-
minecraft地图怎么制作_minecraft地图怎么使用 焦点日报
想必现在有很多小伙伴对于minecraft地图怎么使用方面的知识都比较想要了解,那么今天小好小编就为大家收集
-
阿里旺旺是什么_阿里旺旺 天天最新
1、阿里旺旺是将原先的淘宝旺旺与阿里巴巴贸易通整合在一起的一个新品牌。2、它是淘宝和阿里巴巴为商人量身
-
孙傅字伯野翻译重点字词_孙傅字博野海州人登进士第|环球时快讯
1、《宋史·孙傅传》由元末丞相脱脱和阿鲁图先后主持修撰,原文为:孙傅,字伯野,海州人,登进士第,为礼
-
你抛美债,我抛中债!外资纷纷减持中国债,大量资金流向美国? 全球热门
你抛美债,我抛中债!外资纷纷减持中国债,大量资金流向美国?,中债,债券,美债,美国,中国债,财政资金
-
在网上吵吵嚷嚷的网友,可能都不是人?-当前速讯
虽然我们都知道,现在的互联网,早已是一片乌烟瘴气之地。水军、对立、互骂 不绝于耳、此起彼伏。但不知
-
天天亮点!同业存款与同业存单业务的区别_同业存放和同业存单
1、同业拆放——是向其他银行拆放资金,是银行的资产同业借款——是向其他银行的借款,是银行的负债存放同
-
研发支出资本化支出在资产负债表哪里体现_研发支出资本化
1、新准则中研发支出资本化的条件是比较严格的。2、新准则规定,企业内部研究开发项目开发阶段的支出,同时
-
天天快资讯:为单身残障人士“搭鹊桥” 有爱无碍 携手前行
本报讯(记者李渊通讯员冯莉莺)新潮的屋顶派对,趣味的互动游戏,美味的甜点美食……昨天下午,在姑苏
-
全球微头条丨排爆现场看过吗?武警广西支队带来高清大图
5月16日,武警广西总队机动支队紧贴实战需求组织排爆专业官兵开展搜、排爆训练,进一步提升排爆专业官兵技
-
当前头条:马航MH370被发现?我国卫星成功破谣,意外曝光能力,让美军头疼
距离马航MH370失踪已经过去了很长时间,此前有英国专家称他们在谷歌地图查看时,在柬埔寨的原始森林中发现
-
全球今亮点!鹤岗市第六届梨花节开幕 万株梨花盛放迎客
16日,2023年鹤岗市第六届梨花节暨盛夏消费季在鹤岗市人民广场开幕。在该市面积最大的梨园“梨花谷”
-
金冠电气充电桩订单增长4150%悄悄长大,控制人成谜|决策要点
睿蓝研究团队|夫则宋编辑|LZJW《蓝筹企业评论》出品摘要:金冠电气是一家立足河南南阳的电力设备供应商,