Java NIO(四)文件通道
文件通道
通道是访问I/O服务的导管,I/O可以分为广义的两大类:File I/O和Stream I/O。那么相应的,通道也有两种类型,它们是文件(File)通道和套接字(Socket)通道。文件通道指的是FileChannel,套接字通道则有三个,分别是SocketChannel、ServerSocketChannel和DatagramChannel
通道可以有多种方式创建。Socket通道有直接创建Socket通道的工厂方法(open()方法)。一个FileChannel对象却只能通过在一个打开的RandomAccessFile、FileInputStream或FileOutputStream对象上调用getChannel()方法来获取,开发者不能直接创建一个FileChannel
文件通道总是阻塞的,不能置于非阻塞模式下
FileChannel对象是线程安全的。多个进程可以在同一个实例上并发调用方法而不会引起任何问题,不过并非所有的操作都是多线程的。影响通道位置或者影响文件的操作都是单线程的,如果有一个线程已经在执行会影响通道位置或文件大小的操作,那么其他尝试进行此类操作之一的线程必须等待,并发行为也会受到底层操作系统或文件系统的影响。
打开FileChannel
RandomAccessFile aFile = new RandomAccessFile("data.txt", "rw");
FileChannel fileChannel = aFile.getChannel();
从FileChannel读取数据
ByteBuffer buf = ByteBuffer.allocate(100);
int bytr = fileChannel.read(buf);
注意: read()方法返回的int值表示读取了多少字节数到Buffer中,如果为-1,则表示到了文件末尾
向FileChannel中写入数据
String str = "some thing";
ByteBuffer buf = ByteBuffer.allocate(100);
buf.clear();
buf.put(str.getBytes());
buf.flip();
while(buf.hasRemaining()){
fileChannel.write(buf);
}
9 fileChannel.close();
注意: write()方法是在while循环里的。因为无法保证write()一次能写入多少字节,因此需要重复调用,知道Buffer中没有尚未写入到Channel中的数据
关闭FileChannel
fileChannel.close();
position()方法
有时可能需要在FileChannel中某个特定位置进行数据的读写操作,可以通过position()方法获取FileChannel的当前位置,也可以通过position(long newPosition)设置FileChannel的位置
long position = channel.position();
channel.position(position+10);
注意: 如果将位置设置到文件结束符之后,然后读取字节将返回-1,写入字节,文件将扩大到当前位置,并将数据写入通道。这可能导致“文件空洞”,磁盘上物理文件中写入的数据间有空隙
size()方法
long size = fileChannel.size();
返回实例所关联的文件大小
truncate()方法
fileChannel.truncate(1024);
该方法截取一个文件,截取文件时,文件中指定部分后面的数据将被删除,上面的例子表示截取文件前1024个字节
force()方法
fileChannel.force(true);
该方法将通道里尚未写入到磁盘的数据强制写入到磁盘上。出于性能方面的考虑,操作系统会将数据缓存在内存中,所以无法保证写入到FileChannel里的数据一定会即时写到磁盘上。要保证这一点,需要调用force()方法。
force()方法有一个boolean类型的参数,指明是否同时将文件元数据(权限信息等)写到磁盘上。
Java NIO(四)文件通道的更多相关文章
- java输入输出 -- java NIO之文件通道
一.简介 通道是 Java NIO 的核心内容之一,在使用上,通道需和缓存类(ByteBuffer)配合完成读写等操作.与传统的流式 IO 中数据单向流动不同,通道中的数据可以双向流动.通道既可以读, ...
- JAVA NIO之文件通道
1.简介 通道是 Java NIO 的核心内容之一,在使用上,通道需和缓存类(ByteBuffer)配合完成读写等操作.与传统的流式 IO 中数据单向流动不同,通道中的数据可以双向流动.通道既可以读, ...
- Java IO和Java NIO在文件拷贝上的性能差异分析
1. 在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...
- Java NIO中的通道Channel(二)分散/聚集 Scatter/Gather
什么是Scatter/Gather scatter/gather指的在多个缓冲区上实现一个简单的I/O操作,比如从通道中读取数据到多个缓冲区,或从多个缓冲区中写入数据到通道: scatter(分散): ...
- Java NIO中的通道Channel(一)通道基础
什么是通道Channel 这个说实话挺难定义的,有点抽象,不过我们可以根据它的用途来理解: 通道主要用于传输数据,从缓冲区的一侧传到另一侧的实体(如文件.套接字...),反之亦然: 通道是访问IO服务 ...
- Java NIO 读取文件、写入文件、读取写入混合
前言 Java NIO(new/inputstream outputstream)使用通道.缓冲来操作流,所以要深刻理解这些概念,尤其是,缓冲中的数据结构(当前位置(position).限制(limi ...
- Java7 新特性 —— java.nio.file 文件操作
本文部分摘自 On Java 8 自 Java7 开始,Java 终于简化了文件读写的基本操作,新增了 java.nio.file 库,通过与 Java8 新增的 stream 结合可以使得文件操作变 ...
- java nio 映射文件内容到内存
FileChannel 的一个最好的功能就是能将文件的某个部分直接映射到内存.这要感谢 FileChannel.map() 方法,这个方法有下面三个参数: mode:映射到内存需要指定下面三种模式之一 ...
- Java NIO.2 —— 文件或目录移动操作
移动文件树是复制和删除的文件树的结合.实际上,有两种方式来完成文件的移动.一种是使用Files.move(), Files.copy(), 和Files.delete() 这三个方法:另一种是只使用F ...
- Java NIO.2 —— 文件或目录拷贝操作
拷贝整个文件树是可以递归每个目录和文件调用 Files.copy()方法.在使用的时候有一下注意事项. 在往目录拷贝文件之前,首先要保证目录已经存在.拷贝源目录(不论是否为空)都会生成目标目录.整个任 ...
随机推荐
- 用来生成get set string 方法
https://projectlombok.org/ 主要是用来生成get set string 方法等等 原理是注解
- Win10 UWP Tile Generator
图标生成器 https://marketplace.visualstudio.com/items?itemName=shenchauhan.UWPTileGenerator 备份地址: http:// ...
- win7不需要密码访问网络共享文件(转载)
大家是不是觉得,共享一个文件夹后,每次输入密码都很麻烦呢?有没有不需要输入密码就可以访问共享文件的方法呢? 答案是肯定的,当然有,下面介绍下win7不需要密码访问网络共享文件 工具/原料 两台电脑在局 ...
- 洛谷P2296 寻找道路_简单BFS
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...
- [NOI2005]瑰丽华尔兹_动态规划_单调队列
Code: #include<cstdio> #include<cstring> #include<deque> #include<algorithm> ...
- Python——Day2(笔记代码)
# test = "大pandaboy"# v=test.capitalize()#首字母大写,当为汉字时失效# print(v)######################### ...
- rm -fr删除不了文件
向各位求教:一个阿里的 ecs服务器,放网站的.估计被挂马了,其中网站下的一个文件index.html,被篡改,想删除,但是删除不了. ls -l 结果:-r--r--r-- 1 www www ...
- Maven Hibernate
1.使用maven管理Hibernate实现自动装配jar包 2.需要在配置文件pom.xml中引入 如:引入hibaernate5.2.11.Final版本的jar包,需要做如下配置: <!- ...
- etymology-R
1)vor = to eat devour vt. 狼吞虎咽地吃光: 吞没,毁灭: 目不转睛地看[de-向下+vour-吃] voracity n.贪食,贪婪.拉丁词根vor-,vorac-表示吞食 ...
- rails 安装后调整gem sources 地址
rails 安装后调整gem sources 地址 使用https会有认证的问题: 移除原有的: gem sources --remove https://rubygems.org/ 查看当前的: g ...