Java nio包FileChannel详解

目录

一、FileChannel

1. 打开 FileChannel

2. 读取数据到 ByteBuffer

3. 写入数据到 FileChannel

4. 文件位置操作

5. 文件截取

6. 强制刷新

7. 关闭 FileChannel

 二、FileChannel 读取文件内容


Java NIO(New I/O)是 Java 1.4 引入的一组提供更强大、更灵活的 I/O 操作的 API。它主要包括 java.nio 包,其中的核心组件是 java.nio.channelsjava.nio.file

一、FileChannel

FileChannel 是 Java NIO 中用于读取和写入文件的通道。它是 java.nio.channels 包中的一个接口,提供了一些方法,使得对文件进行读写变得更为灵活。以下是一些 FileChannel 的常用操作:

1. 打开 FileChannel

你可以使用 RandomAccessFile 或者 FileInputStream / FileOutputStream 来获取一个 FileChannel 对象。

使用 RandomAccessFile:

RandomAccessFile file = new RandomAccessFile("example.txt", "rw"); 
FileChannel channel = file.getChannel();

使用 FileInputStreamFileOutputStream:

FileInputStream fis = new FileInputStream("example.txt"); 
FileChannel inputChannel = fis.getChannel(); 
FileOutputStream fos = new FileOutputStream("output.txt"); 
FileChannel outputChannel = fos.getChannel();
2. 读取数据到 ByteBuffer

使用 read() 方法可以将数据从 FileChannel 读取到 ByteBuffer 中。

ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = channel.read(buffer);
3. 写入数据到 FileChannel

使用 write() 方法可以将数据从 ByteBuffer 写入到 FileChannel

ByteBuffer buffer = ByteBuffer.wrap("Hello, World!".getBytes()); 
int bytesWritten = channel.write(buffer);
4. 文件位置操作

FileChannel 维护一个当前位置(position),读写操作都是从当前位置开始的。在读写之后,位置会自动更新。

long currentPosition = channel.position(); // 获取当前位置 
channel.position(newPosition); // 设置新的位置 
channel.position(channel.size()); // 将位置设置到文件末尾
5. 文件截取

truncate() 方法可以截取文件的长度。截取文件后,文件的大小将被截短,多余的部分被删除。

channel.truncate(newSize);
6. 强制刷新

force() 方法可以强制将文件的所有修改写入磁盘。

channel.force(true); // 强制将文件的所有修改写入磁盘
7. 关闭 FileChannel

使用 close() 方法关闭 FileChannel

channel.close();

 二、FileChannel 读取文件内容

使用FileChannel读取文件内容

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;public class FileChannelExample {public static void main(String[] args) {try {// 打开文件通道RandomAccessFile file = new RandomAccessFile("example.txt", "r");FileChannel channel = file.getChannel();// 创建缓冲区ByteBuffer buffer = ByteBuffer.allocate(1024);// 从通道读取数据到缓冲区int bytesRead = channel.read(buffer);while (bytesRead != -1) {System.out.println("Read " + bytesRead + " bytes.");// 切换缓冲区为读模式buffer.flip();// 读取缓冲区中的数据while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}// 清空缓冲区buffer.clear();// 继续从通道读取数据到缓冲区bytesRead = channel.read(buffer);}// 关闭通道和文件channel.close();file.close();} catch (Exception e) {e.printStackTrace();}}
}

这个示例打开一个文件通道,然后使用 ByteBuffer 缓冲区从文件中读取数据。读取后,缓冲区切换为读模式,然后逐个字节输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解Python包管理工具pip的基本命令和使用

在Python编程中,我们经常需要使用各种第三方库来扩展我们的功能。为了方便地管理和安装这些库,Python提供了一个名为pip的包管理工具。本文将详细介绍pip的基本命令和使用,帮助读者更好地理解和使用这个强大的工具。 1. 安装pip 首先&#…

Redis系列之keys命令和scan命令性能对比

项目场景 Redis的keys *命令在生产环境是慎用的,特别是一些并发量很大的项目,原因是Redis是单线程的,keys *会引发Redis锁,占用reids CPU,如果key数量很大而且并发是比较大的情况,效率是很慢的&#xff0c…

Docker 安装 Redis 挂载配置

1. 创建挂载文件目录 mkdir -p /home/redis/config mkdir -p /home/redis/data # 创建配置文件:docker容器中默认不包含配置文件 touch /home/redis/config/redis.conf2. 书写配置文件 # Redis 服务器配置# 绑定的 IP 地址,默认为本地回环地址 127.0.0…

WSL2+tensorflow-gpu 2.3.0 C++ 源码编译(Linux)

一. gcc版本 wsl2已有gcc 版本为9.4.0,但tensorflow2.3.0需对应gcc7.3.1 tensorflow与cuda cudnn python bazel gcc版本对应关系 故需下载一个低版本的gcc,但同时还想保留较高版本的gcc,那么参考文章:深度学习环境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切换解…

【每日OJ —— 145. 二叉树的后序遍历】

每日OJ —— 145. 二叉树的后序遍历 1.题目:145. 二叉树的后序遍历2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目:145. 二叉树的后序遍历 2.解法 2.1.算法讲解 1.首先如果在每次每个节点遍历的时候都去为数组开辟空间,这样的效率太…

JavaScript基础知识21——for循环

哈喽,大家好,我是雷工! 今天学习for循环,以下为学习笔记。 1、while循环和for循环有啥不同? 1.1、在实际开发中,while循环用来解决循环次数不确定时使用,当一个循环不确定会循环多少次时&#…

探索人工智能领域——每日20个名词详解【day9】

目录 前言 正文 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请事先与我联系以…

HttpRunner4 Python版(十二)自动化测试平台 实战开发接入案例 技术实现 功能逻辑大致梳理 实行方案初稿

前言 通过之前的文档相信你对HttpRunner 4.x Python版本以后有较为深入的理解和认识了,本文主要讲解 动化测试平台 实战开发接入案例 技术实现 功能逻辑大致梳理 实行方案初稿,后续具体案例需要根据自身项目组的功能去具体实现,并在日常维护工作中逐步完善并增加其健壮性。 …

【Unity3D】Android打包报错AAPT2:xxx Linkxxx

Gradle Plugin 与Gradle版本不匹配问题 或 相关依赖库下载不完全问题; 使用镜像即可解决 也可以离线(离线过于复杂 你能找到方法那最好是离线Maven) 仓库服务 找最新可用的镜像url,替换google()和jcenter(), 可以直接使用publ…

css处理 纯英文数据不换行问题 - word-break、word-wrap

问题图 解决 添加 css 样式 word-break: break-all;补充 还有一个 word-wrap 样式,可以看下 参考 : word-wrap: normal 只在允许的断字点换行(浏览器保持默认处理)。word-wrap: break-word 在长单词或 URL 地址内部进行换行。

嵌入式C语言中的关键字volatile

嵌入式C语言中的关键字volatile 嵌入式C语言中的关键字volatile 嵌入式C语言中的关键字volatile一. volatile关键字的概念二. 不使用volatile关键字三. 编译器优化介绍四. volatile详解五. 编译器优化举例1)例:没有volatile关键字的优化2)例&…

【Python】zip

Python中的zip()函数可以将多个可迭代对象打包成一个元组序列,然后返回这些元组序列组成的迭代器。zip()函数的语法如下: zip(*iterables)其中,iterables是可迭代对象,可以是多个,也可以是一个。zip()函数将返回一个迭…

Flask 3.x AttributeError: ‘Provide‘ object has no attribute ‘xxxx‘

用了几天flask,之前都好好的,今天在规范项目结构而且加了一堆代码之后突然出现了这个错,心想不会啊,之前都好好的,chatGPT, new bing ,stackoverflow都问遍了,就是找不到正确的解决方案,回家之后一点点的rollback检查,终于发现问题所在了. 首先呢先说说一般的解决方法: 这就是…

获得矩阵对角线元素的索引 numpy.diag_indices_from()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 获得矩阵对角线元素的索引 numpy.diag_indices_from() [太阳]选择题 请问关于以下代码的选项表述错误的是? import numpy as np a np.array([[1, 2, 3], [4, 5, 6…

算法 搜索

深度优先搜索 广度优先搜索 深搜与广搜的区别 深搜 dfs——回溯——“不撞南墙不回头” 思路 总的来说是不撞南墙不回头,相当于一个人严格按照固定的行为模式。 例如走方格,依次走上下左右,每次走到一个新格子记录自己已经走过的方向&am…

技术阅读周刊第第8️⃣期

技术阅读周刊,每周更新。 历史更新 20231103:第四期20231107:第五期20231117:第六期20231124:第七期 Prometheus vs. VictoriaMetrics (VM) | Last9 URL: https://last9.io/blog/prometheus-vs-victoriametrics/?refd…

微服务1 springcloud学习笔记P1-P40

b微服务技术栈_哔哩哔哩_bilibili 文档资料: 链接:https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码:d03r 一 了解微服务技术 二 Eureka (1) Eureka配置 (2) 注册user-service (3) 总结 Ribbon 负载均衡 (1) 流程 三 nacos配置管理…

26、pytest使用allure解读

官方实例 # content of pytest_quick_start_test.py import allurepytestmark [allure.epic("My first epic"), allure.feature("Quick start feature")]allure.id(1) allure.story("Simple story") allure.title("test_allure_simple_te…

MySQL_2.常用维护命令

(1)查看数据库版本 show variables like %version%; (2)数据库信息 列出所有的数据库 show databases; 切换数据库 use <database_name>; 查看数据库信息 show databases <database_name>; 查看当前使用数据库 …

百度Apollo新版本Beta技术沙龙参会体验

在自动驾驶领域&#xff0c;百度的Apollo一直是业界开源的标杆。其持续升级和创新的开源项目为整个自动驾驶行业树立了典范&#xff0c;不仅推动了技术的发展&#xff0c;也为广大的社区开发者们提供了学习和参考的范本。最近百度发布了Apollo新的Beta版本&#xff0c; 新版本B…