前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第七节 netty前传-NIO 几种channel介绍

第七节 netty前传-NIO 几种channel介绍

作者头像
用户1418372
发布2018-12-04 10:04:24
3570
发布2018-12-04 10:04:24
举报
文章被收录于专栏:清晨我上码清晨我上码

FileChannel

前面已经简单介绍过 FileChannel,文件通道时阻塞的

  1. 使用: 在使用FileChannel前,须先将其打开。 通过InputStream,OutputStream或RandomAccessFile获取FileChannel。 以下是通过RandomAccessFile打开FileChannel的方法:
代码语言:javascript
复制
RandomAccessFile randomAccessFile =
                    new RandomAccessFile("F:\\data\\test.txt","rw")){
            //获取连接通道
            FileChannel fileChannel = randomAccessFile.getChannel();
  • 注意: 文件通道无法直接打开
  1. 从FileChannel读取数据,将数据写入FileChannel(前面我们了解到通道的操作,是需要buffer参与的)
代码语言:javascript
复制
ByteBuffer buf = ByteBuffer.allocate(48);
//此方法将数据从FileChannel读入缓冲区。 read()方法返回的int告诉缓冲区中有多少字节。 如果返回-1,则到达文件结尾。
int bytesRead = inChannel.read(buf);

FileChannel.write()方法将数据写入FileChannel,该方法将Buffer作为参数。

代码语言:javascript
复制
String newData = test data..." + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
//数据写入缓冲
buf.put(newData.getBytes());
//切换为读模式
buf.flip();
//直到没有数据可读
while(buf.hasRemaining()) {
    channel.write(buf);
}
  • 注意操对文件的读写操作完成都需要关闭通道减少资源损耗

channel.close();

  1. 在文件指定位置读写

调用position()方法能够获取FileChannel对象的当前位置。 也可以通过调用position(long pos)方法来设置FileChannel的位置。

代码语言:javascript
复制
long pos channel.position();
channel.position(pos +32);
  • 需要注意的是,如果设置的位置在文件的结尾,读取的时候会返回-1,-1表示文件结束标记。如果在文件结束后设置位置并写入数据到通道,则文件会以适合位置和写入数据。 这可能导致“文件漏洞”,磁盘上的物理文件在写入数据中存在间隙。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.10.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • FileChannel
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档