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 指令进行完成. 所有语言运行时系统提供执 ...
随机推荐
- python3 多线程和多进程
一.线程和进程 1.操作系统中,线程是CPU调度和分派的基本单位,线程依存于程序中 2.操作系统中,进程是系统进行资源分配和调度的一个基本单位,一个程序至少有一个进程 3.一个进程由至少一个线程组成, ...
- 【Jenkins】忘记admin密码,可以用此方法帮你解决
突然有一日发现自己忘记了jenkins的管理员密码,因为我一直登录的是另外一个非管理员账户.如果出现必须要使用管理员账户操作的,比如用户管理那里的,必须要管理员账号吧,这就尴尬了. 很方的我打开安装j ...
- BM(Berlekamp-Massey)算法
线性递推的题目区域赛里还是挺多的,还是有必要学一下 ~ BM(Berlekamp-Massey)算法 ~ 有一个$n$阶线性递推$f$,想要计算$f(m)$,有一种常用的办法是矩阵快速幂,复杂度是$O ...
- [转载]深入理解Java垃圾回收机制
深入理解Java垃圾回收机制 2016-07-28 20:07:49 湖冰2019 阅读数 14607更多 分类专栏: JAVA基础 原文:http://www.linuxidc.com/Linu ...
- redis事务机制
目录 一.事务的实现 1.multi——开启事务 2.命令入队列 3.exec——执行事务 4.DISCARD——放弃执行 5.错误处理 二.watch命令 redis官方文档:Redis trans ...
- intelij idea 常用插件下载
本文,给大家推荐几款我私藏已久的,自己经常使用的,可以提升代码效率的插件.IDEA插件简介常见的IDEA插件主要有如下几类:常用工具支持Java日常开发需要接触到很多常用的工具,为了便于使用,很多工具 ...
- Luogu P4270 [USACO18FEB]Cow Gymnasts (打表找规律)
题意 传送门 题解 首先我们不竖着看奶牛而是横着看.从下往上把奶牛叫做处于第0,1,2...0,1,2...0,1,2...层.那么相当于第000层的不动,第111层的平移一格,第222层的平移222 ...
- 慕课网SSM仿大众点评
目录: 配置部分: 1 配置报错不支持diamond运算符 运行部分: 1 登录的账号密码 2 运行项目是报错session超时 配置部分 1 配置报错不支持diamond运算符 原报错信息如下:id ...
- 使用 ALinq 实现 Linq to MySQL【转】
http://www.cnblogs.com/huangcong/archive/2011/05/24/2055204.html
- Codeforces Educational Codeforces Round 67
目录 Contest Info Solutions A. Stickers and Toys B. Letters Shop C. Vasya And Array D. Subarray Sortin ...