当前位置: 首页 > 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算法“)
  • 【EOS】Cleos基础
  • css的样式优先级
  • Hibernate最全面试题
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript设计模式之工厂模式
  • js学习笔记
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • mysql_config not found
  • overflow: hidden IE7无效
  • vue学习系列(二)vue-cli
  • 测试开发系类之接口自动化测试
  • 基于HAProxy的高性能缓存服务器nuster
  • 记录:CentOS7.2配置LNMP环境记录
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 微服务入门【系列视频课程】
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 优化 Vue 项目编译文件大小
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Linux权限管理(week1_day5)--技术流ken
  • # Maven错误Error executing Maven
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #pragma once与条件编译
  • #ubuntu# #git# repository git config --global --add safe.directory
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (转)大型网站架构演变和知识体系
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ****Linux下Mysql的安装和配置
  • .CSS-hover 的解释
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net/c# memcached 获取所有缓存键(keys)
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • /etc/skel 目录作用
  • [2016.7 day.5] T2
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [ANT] 项目中应用ANT