Java NIO学习笔记五 FileChannel(文件通道)
Java NIO FileChannel
Java NIO FileChannel是连接文件的通道。使用FileChannel,您可以从文件中读取数据和将数据写入文件。Java NIO FileChannel类是NIO用于替代使用标准Java IO API读取文件的方法。
FileChannel无法设置为非阻塞模式。它总是以阻止模式运行。
开启FileChannel
使用之前,FileChannel必须被打开,但是你无法直接打开FileChannel。需要通过InputStream,OutputStream或RandomAccessFile获取FileChannel。
以下是通过RandomAccessFile打开FileChannel的方法:
RandomAccessFile aFile = new RandomAccessFile(“data / nio-data.txt”,“rw”);
FileChannel inChannel = aFile.getChannel();
从FileChannel读取数据
要从FileChannel读取数据,您需要调用read()方法。
代码展示:
ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf);
首先:给Buffer分配大小, 从中FileChannel读取的数据会被读入Buffer。
其次:调用FileChannel的read()方法。这个方法从FileChannel读取数据读入到Buffer。read()方法返回值是int类型,表示多少个字节被插入Buffer。如果返回-1,则到达文件结尾即文件读取完成。
将数据写入FileChannel
使用Fwrite() 方法将数据写入ileChannel,该方法使用Buffer作为参数。
代码展示:
String newData =“要写入文件的新字符串...”+ System.currentTimeMillis(); ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes()); buf.flip(); while(buf.hasRemaining()){
channel.write(BUF);
}
注意FileChannel的write()在while循环中是如何调用该方法。不能保证write()方法写入的字节数。因此,重复write()调用,直到Buffer没有字节写入。
关闭FileChannel
完成使用后,FileChannel您必须关闭它。
代码展示:
channel.close();
FileChannel位置
对FileChannel进行读取或写入时,你会在特定的位置上这样做。您可以通过调用FileChannel的position()方法来获取对象的当前位置。
还可以通过调用FileChannel的position(long pos)方法设置位置。
Java代码展示:
long pos channel.position(); channel.position(pos +123);
如果你在文件结束后设置位置,并尝试从通道读取位置,您将获得-1 - 是 文件结尾标记。
如果在文件结束后设置位置,并写入到通道,文件将被扩展以适应位置和写入数据。这可能会导致“文件孔”,其中磁盘上的物理文件在写入的数据中有间隙。
FileChannel大小
FileChannel对象的size()方法返回通道连接到的文件的文件大小。
Java代码展示:
long fileSize = channel.size();
FileChannel截断
您可以通过调用该FileChannel的truncate()方法来截断文件。当您截断文件时,您可以在给定的长度上将其截断。
代码展示:
channel.truncate(1024);
此示例以1024字节的长度截断文件。
FileChannel Force
FileChannel的force()方法将所有未写入的数据从通道刷新到磁盘中。在你调用该force()方法之前,出于性能原因,操作系统可能会将数据缓存在内存中,因此您不能保证写入通道的数据实际上写入磁盘。
force()方法采用布尔值作为参数,说明文件元数据(权限等)是否也应被刷新。
这是一个刷新数据和元数据的示例:
channel.force(true);
Java NIO学习笔记五 FileChannel(文件通道)的更多相关文章
- Java NIO 学习笔记五 缓冲区补充
1.缓冲区分配 方法 以 ByteBuffer 为例 (1)使用静态方法 ByteBuffer buffer = ByteBuffer.allocate( 500 ); allocate() 方法 ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(四)----文件通道和网络通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(二)----聚集和分散,通道到通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java IO学习笔记五:BIO到NIO
作者:Grey 原文地址: Java IO学习笔记五:BIO到NIO 准备环境 准备一个CentOS7的Linux实例: 实例的IP: 192.168.205.138 我们这次实验的目的就是直观感受一 ...
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(一)----概述,Channel/Buffer
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO学习笔记
Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...
随机推荐
- 【Leetcode】【中等】【36. 有效的数独】【JavaScript】
题目描述 36. 有效的数独 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1- ...
- python关于解决'\u'开头的字符串转中文的方法
转自: https://www.cnblogs.com/hahaxzy9500/p/7685955.html 字符串转中文: s = '\u5468\u661f\u9170' print(s) ##打 ...
- 阿里云服务器搭建gitlab
参考这位大神的博客 https://blog.csdn.net/zhaoyanjun6/article/details/79144175 安装邮件通知服务系统时,报了如下错误:send-mail: f ...
- 学习Hook的必备知识
1.汇编 2.API 3.内存 4.进程 5.窗口 必须熟悉的汇编指令: PUSH 入栈 MOV 赋值 JMP(JNZ JE) 跳转 CALL 调用函数 RET 返回 Cmp 比较 T ...
- [Visual Studio] 自定义项目模板(.vsix扩展)
VS自定义项目模板:[2]创建VSIX项目模板扩展 听语音 | 浏览:1237 | 更新:2015-01-02 09:21 | 标签:软件开发 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师 ...
- Selenium(三)webdriver的API与定位元素
在学习定位元素之前,应该要学会: 1.打开浏览器 2.打开网页 3.定位元素及操作 ①定位元素 可只此输入框的id是kw,name是wd,class是s_ipt ②在python编辑器中找到该元素 通 ...
- IP分组
IP 分组为了更准确地讨论 I n t e r n e t协议处理,我们必须定义一些名词.图 显示了在不同的I n t e r n e t层之间传递数据时用来描述数据的名词.我们把传输协议交给 I P ...
- springboot项目上有个红叉,且ecplise没有自动编译项目,运行提示“错误: 找不到或无法加载主类”
近期在做springboot项目,发现springboot项目上有个红叉但找不到哪个类报错,ecplise没有把项目自动编译,运行还提示“错误: 找不到或无法加载主类”,进入工作空间“项目\targe ...
- Tensorflow2.0学习(一)
站长资讯平台:今天学习一下Tensorflow2.0 的基础 核心库,@tf.function ,可以方便的将动态图的语言,变成静态图,在某种程度上进行计算加速 TensorFlow Lite Ten ...
- 一个有趣的 SQL 查询
来源:站长资讯 一个朋友有这样一个SQL查询需求: 有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time).表结构如下: ********************* ...