当前位置: 首页 > news >正文

# Java NIO(一)FileChannel

Java NIO

1.BIO与NIO的区别

BIO为阻塞IO,NIO为非阻塞IO。

BIONIO
JAVA1.4之前Java 1.4之后
面向流:以byte为单位处理数据面向块:以块为单位处理数据
同步阻塞同步非阻塞
选择器(Selector)

1.1NIO的核心组成部分

  • Channels
    Channel是双向的,既能做读操作也能做写操作,常见Channel如下:
Channel类功能
FileChannel文件数据读写
DtagramChannelUDP数据读写
ServerScoketChannel和SocketChannelTCP数据读写
  • Buffers
    缓冲区
  • Selectors
    选择器,用于监听多个通道的事件,可实现单个线程就可以监听多个客户端通道。

2.Channel

Channel封装了对数据源的操作,可以操作多种数据源,但是不必关心数据源的具体物理结构。Channel用于在字节缓冲区和另一侧的实体之间有效地传输数据。

Channel所有数据都是通过Buffer对象进行处理,通道要么读数据到缓冲区,要么从缓冲区写入到通道。

public interface Channle extend Closeable {public boolean isOpen();public void close() throws IOException;
}
2.1 FileChannel

FileChannel常用方法如下;

方法名作用
public int read(ByteBuffer dst)从通道读取数据并放到缓冲区中
public int write(ByteBuffer src)把缓冲区的数据写到通道中
public long transferFrom(ReadableByteChannel src, long position, long count)从目标通道中复制数据到当前通道
public long transferTo(long position, long count, WritableByteChannel target)把数据从当前通道复制给目标通道

无法直接打开一个FileChannel,常见的方法是通过inPutStream和outPutStream或RandomAccessFile获取一个FileChannel实例。
示例代码
文件写入示例

package com.hero.nio.file;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
//通过NIO实现文件IO
public class TestNIO {
@Test //往本地文件中写数据
public void test1() throws Exception{//1. 创建输出流FileOutputStream fos=new FileOutputStream("basic.txt");//2. 从流中得到一个通道FileChannel fc=fos.getChannel();//3. 提供一个缓冲区ByteBuffer buffer=ByteBuffer.allocate(1024);//4. 往缓冲区中存入数据String str="HelloJava";buffer.put(str.getBytes());//5. 翻转缓冲区buffer.flip();while(buffer.hasRemaining()) {//6. 把缓冲区写到通道中fc.write(buffer);}//7. 关闭fos.close();}
}

文件复制示例

public void test4() throws Exception {//1. 创建两个流FileInputStream fis = new FileInputStream("basic2.txt");FileOutputStream fos = new FileOutputStream("basic3.txt");//2. 得到两个通道FileChannel sourceFC = fis.getChannel();FileChannel destFC = fos.getChannel();//3. 复制destFC.transferFrom(sourceFC, 0, sourceFC.size());//4. 关闭fis.close();fos.close();
}

相关文章:

  • Spring Boot3整合knife4j(swagger3)
  • 景联文科技大模型数据集更新!教育题库新增高质量数学题、逻辑推理题及英文题
  • Python + Open3D:使用Open3D读取和显示点云
  • 面试高频知识点:2线程 2.1 线程池 2.1.1 为什么使用线程池?
  • 网络协议与攻击模拟_09部署DHCP服务器
  • 使用DBSyncer同步Oracle11g数据到Mysql5.7中_实现全量数据同步和增量数据实时同步_操作过程---数据同步之DBSyncer工作笔记007
  • uniapp 用web-view嵌套网页地址并传参
  • C语言用户态函数可观测性
  • 前后台分离跨域交互
  • 【GitHub项目推荐--不错的Flutter项目】【转载】
  • part3 jdk17新特性详解
  • 数据结构排序算详解(动态图+代码描述)
  • 向设备树中添加pinctrl节点与gpio节点的方法
  • ReactHooks 官网文档翻译
  • React进阶 - 14(说一说”虚拟DOM“中的”Diff算法“)
  • [NodeJS] 关于Buffer
  • [译]CSS 居中(Center)方法大合集
  • 【笔记】你不知道的JS读书笔记——Promise
  • 03Go 类型总结
  • CentOS从零开始部署Nodejs项目
  • CSS魔法堂:Absolute Positioning就这个样
  • Less 日常用法
  • OSS Web直传 (文件图片)
  • python_bomb----数据类型总结
  • Selenium实战教程系列(二)---元素定位
  • springboot_database项目介绍
  • v-if和v-for连用出现的问题
  • Vue2.x学习三:事件处理生命周期钩子
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 动态规划入门(以爬楼梯为例)
  • 缓存与缓冲
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 聚类分析——Kmeans
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 微信小程序:实现悬浮返回和分享按钮
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 鱼骨图 - 如何绘制?
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 交换综合实验一
  • ​如何在iOS手机上查看应用日志
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (ZT)一个美国文科博士的YardLife
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (转)fock函数详解
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .bat批处理出现中文乱码的情况
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解