FileChannel(API详解)
1、两种获取通道的方法
FileChannel.open()的方式
FileChannel channell = FileChannel.open(Paths.get("a.txt","c.txt"), StandardOpenOption.CREATE,StandardOpenOption.WRITE);
FileChannel channel2 = FileChannel.open(new File("a.txt").toPath(), StandardOpenOption.CREATE_NEW,StandardOpenOption.WRITE,StandardOpenOption.READ);
path获取
Paths.get()
new File(“a.txt”).toPath()
OpenOption接口的实现类通常由StandardOpenOption枚举进行代替。
public enum StandardOpenOption implements OpenOption {
READ,
WRITE,
APPEND,//累加
TRUNCATE_EXISTING,//如果该文件已存在并且为写入访问而打开,则其长度将被截断为0。如果只为读取访问打开文件,则忽略此选项。
CREATE,//不能单独使用,要与WRITE配套使用,单独使用会报错java.nio.file.NoSuchFileException,如果文件已存在,重复创建不会报错
CREATE_NEW,//不能单独使用,要与WRITE配套使用,如果文件已存在,则出现异常java.nio.file.FileAlreadyExistsException
DELETE_ON_CLOSE,
SPARSE,//稀疏文件,空闲位置不占内存(不要使用CREATE来创建稀疏文件)
SYNC,//要求对文件内容或元数据的每次更新都同步写入底层存储设备。如果这样做,程序运行的效率就降低了。
DSYNC;//要求对文件内容的每次更新都同步写入底层存储设备。
//枚举常量SYNC与DSYNC的区别:SYNC更新内容与元数据,而DSYNC只更新内容,与force(boolean)方法作用一样。
从io流中获得通道getChannel()
FileChannel inchannel = new FileInputStream("a.txt").getChannel();
FileChannel outchannel = new FileOutputStream("b.txt").getChannel();
FileChannel inchannel1 = new RandomAccessFile("a.txt","r").getChannel();
FileChannel outchannel1 = new RandomAccessFile("a.txt","rw").getChannel();
2、read
ByteBuffer buffer = ByteBuffer.allocate(10);
ByteBuffer buffer1 = ByteBuffer.allocate(10);
ByteBuffer[] buffers = {buffer,buffer1};
channel2.read(buffer);//将字节序列从此通道的当前位置读入给定的缓冲区的当前位置,方法同步,返回值正数为读取的字节数,0为未读取到数据,可能是缓冲区中没有剩余空间了,-1是到了流的末端
channel2.read(buffer,2);//position代表通道的位置
channel2.read(buffers);//将通道当前位置的字节序列读入多个ByteBuffer缓冲区的remaining剩余空间中,方法同步
channel2.read(buffers,0,8);//offset代表数组的下表,length为向后的缓冲区个数
3、write
ByteBuffer buffer2 = ByteBuffer.wrap(new byte[]{1,2,3,4});
ByteBuffer buffer3 = ByteBuffer.wrap(new byte[]{11,21,31,41});
ByteBuffer[] buffers1 = {buffer2,buffer3};
channell.write(buffer2);//将一个缓冲区中remaining字节序列写入通道的当前位置,write方法同步
channell.write(buffer2,2);//将一个缓冲区中remaining字节序列写入通道的指定位置,此方法不改变痛的位置,write方法同步
channell.write(buffers);//将多个缓冲区中的remaining剩余字节序列写入通道的当前位置,方法同步
channell.write(buffers1,0,8);//指定缓冲区数组的offset下表开始,向后length个字节缓冲区,将每个缓冲区的remaining剩余字节序列写入此通道的当前位置
4、获取和设置通道的位置、大小
channell.position();
channell.position(2); channell.size();//此通道关联文件的当前大小
5、long transferTo(position,count,WritableByteChannel dest)
1)position:文件中的位置,从此位置开始传输,必须为非负数。
2)count:要传输的最大字节数;必须为非负数。
3)dest:目标通道。
long transferTo(position,count,WritableByteChannel dest)方法的作用是将字节从此通道的文件传输到给定的可写入字节通道。
1、试图读取从此通道的文件中给定position处开始的count个字节,并将其写入目标通道的当前位置。
2、此方法的调用不一定传输所有请求的字节,是否传输取决于通道的性质和状态。
如果此通道的文件从给定的position处开始所包含的字节数小于count个字节,或者如果目标通道是非阻塞的并且其输出缓冲区中的自由空间少于count个字节,则所传输的字节数要小于请求的字节数。
3、此方法不修改此通道的位置。如果给定的位置大于该文件的当前大小,则不传输任何字节,否则从目标通道的position位置起始开始写入各字节,然后将该位置增加写入的字节数。
4、与从此通道读取并将内容写入目标通道的简单循环语句相比,此方法可能高效得多。很多操作系统可将字节直接从文件系统缓存传输到目标通道,而无须实际复制各字节。
6、long transferFrom(ReadableByteChannel src,position,count)
1)src:源通道。
2)position:文件中的位置,从此位置开始传输;必须为非负数。
3)count:要传输的最大字节数;必须为非负数。
注意,参数position是指当前通道的位置,而不是指src源通道的位置。参数position针对于调用transferTo()或transferFrom()方法的对象。
long transferFrom(ReadableByteChannel src,position,count)方法的作用是将字节从给定的可读取字节通道传输到此通道的文件中。
1、试着从源通道中最多读取count个字节,并将其写入到此通道的文件中从给定position处开始的位置。
2、此方法的调用不一定传输所有请求的字节;是否传输取决于通道的性质和状态。
如果源通道的剩余空间小于count个字节,或者如果源通道是非阻塞的并且其输入缓冲区中直接可用的空间小于count个字节,则所传输的字节数要小于请求的字节数。
3、此方法不修改此通道的位置。如果给定的位置大于该文件的当前大小,则不传输任何字节。从源通道中的当前位置开始读取各字节写入到当前通道,然后将src通道的位置增加读取的字节数。
4、与从源通道读取并将内容写入此通道的简单循环语句相比,此方法可能高效得多。很多操作系统可将字节直接从源通道传输到文件系统缓存,而无须实际复制各字节。
7、截断缓冲区(在源文件上截取,并不是得到新文件)
channel2.truncate(100);
truncate(long size)方法的作用是将此通道的文件截取为给定大小。
如果给定大小小于该文件的当前大小,则截取该文件,丢弃文件新末尾后面的所有字节。
如果给定大小大于或等于该文件的当前大小,则不修改文件。
无论是哪种情况,如果此通道的文件位置大于给定大小,则将位置设置为该大小。
8、将通道文件区域直接映射到内存 map()
MappedByteBuffer map(FileChannel.MapMode mode,long position,long size)方法的作用是将此通道的文件区域直接映射到内存中。
1)mode:根据只读、读取/写入或专用(写入时复制)来映射文件,分别为FileChannel.MapMode类中所定义的READ_ONLY、READ_WRITE和PRIVATE;
2)position:文件中的位置,映射区域从此位置开始;必须为非负数。
3)size:要映射的区域大小;必须为非负数且不大于Integer.MAX_VALUE。
可以通过下列3种模式将文件区域映射到内存中。
1)只读:试图修改得到的缓冲区将导致抛出ReadOnlyBufferException异常。(MapMode.READ_ONLY)
2)读取/写入:对得到的缓冲区的更改最终将传播到文件;该更改对映射到同一文件的其他程序不一定是可见的。(MapMode.READ_WRITE)
3)专用:对得到的缓冲区的更改不会传播到文件,并且该更改对映射到同一文件的其他程序也不是可见的;相反,会创建缓冲区已修改部分的专用副本。(MapMode.PRIVATE)
总结:
1、对于只读映射关系,此通道必须可以进行读取操作;对于读取/写入或专用映射关系,此通道必须可以进行读取和写入操作。
2、此方法返回的已映射字节缓冲区位置为零,限制和容量为size;其标记是不确定的。在缓冲区本身被作为垃圾回收之前,该缓冲区及其表示的映射关系都是有效的。
3、映射关系一经创建,就不再依赖于创建它时所用的文件通道。特别是关闭该通道对映射关系的有效性没有任何影响。
4、对于大多数操作系统而言,与通过普通的read()和write()方法读取或写入数千字节的数据相比,将文件映射到内存中开销更大。从性能的观点来看,通常将相对较大的文件映射到内存中才是值得的。
MappedByteBuffer的简单介绍:
它是直接字节缓冲区,其内容是文件的内存映射区域。映射的字节缓冲区是通过FileChannel.map()方法创建的。此类用特定于内存映射文件区域的操作扩展ByteBuffer类。
public abstract class MappedByteBuffer extends ByteBuffer
作为ByteBuffer的子类,除了具有父类的方法外,还新增了
force()将此缓冲区所做的内容更改强制写入包含映射文件的存储设备中。
load()将此缓冲区内容加载到物理内存中。
isLoaded()判断次缓冲区的内容是否位于物理内存中。
FileChannel类或MappedByteBuffer类对文件进行操作时,在大部分情况下,它们的效率并不比使用InputStream或OutputStream高很多,这是因为NIO的出现是为了解决操作I/O线程阻塞的问题,使用NIO就把线程变成了非阻塞,这样就提高了运行效率。
NIO真正的优势:非阻塞。
FileChannel(API详解)的更多相关文章
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...
- jqGrid APi 详解
jqGrid APi 详解 jqGrid皮肤 从3.5版本开始,jqGrid完全支持jquery UI的theme.我们可以从http://jqueryui.com/themeroller/下载我们所 ...
- hibernate学习(2)——api详解对象
1 Configuration 配置对象 /详解Configuration对象 public class Configuration_test { @Test //Configuration 用户 ...
- 网络编程socket基本API详解(转)
网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...
- 转】Mahout推荐算法API详解
原博文出自于: http://blog.fens.me/mahout-recommendation-api/ 感谢! Posted: Oct 21, 2013 Tags: itemCFknnMahou ...
- dom4j api 详解--XPath 节点详解
dom4j api 详解 http://871421448.iteye.com/blog/1546955 XPath 节点 http://www.w3school.com.cn/xpath/xpath ...
- 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:
原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...
- 【Unity编程】Unity中关于四元数的API详解
本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计 ...
- SDN 网络系统之 Mininet 与 API 详解
SDN 网络系统之 Mininet 与 API 详解 Mininet 是轻量级的软件定义网络系统平台,同时提供了对 OpenFlow 协议的支持.本文主要介绍了 Mininet 的相关概念与特性,并列 ...
- Webdriver之API详解(1)
说明 Webdriver API详解,基于python3,unittest框架,driver版本和浏览器自行选择. 本内容需要对python3的unittest框架有一个简单的了解,这里不再赘述,不了 ...
随机推荐
- Retrofit+Okhttp+RxJava打造网络请求之Post
之前一直在准备Android培训的事情,所幸的是终于完事啦,在这过程中真的发现了自身无论从沟通能力还是技术能力上很多的不足,就用一句 路漫漫其修远兮,吾将上下而求索 来勉励自己吧.之前也在项目上用上O ...
- Scrum 冲刺第二篇
我们是这次稳了队,队员分别是温治乾.莫少政.黄思扬.余泽端.江海灵 一.会议 1.1 26号站立式会议照片: 1.2 昨天已完成的事情 团队成员 任务内容 黄思扬 Web 端首页.内容管理页开发. ...
- 【PHP】关于系统性能追踪工具molten
一.简介 关于molten的介绍网上有很多,是一个全链路追踪的工具,Molten可以看做是phptrace的的升级版(流行的php问题定位工具譬如phptrace,xhprof,这些工具可以自行Goo ...
- iptables 学习笔记
1. 安装iptables yum install iptables centos7: yum install -y iptables-services 2. service命令 查看iptables ...
- python 类 专有方法
__init__ : 构造函数,在生成对象时调用 __del__ : 析构函数,释放对象时使用 __repr__ : 打印,转换 __setitem__ : 按照索引赋值 __getitem__: 按 ...
- c# 第五节 第一个控制台程序、第一个桌面、快捷键、注释
本节内容: 1:控制台程序的创建 2:第一个桌面程序 3:快捷键 4:注释 一.第一个控制台程序: 这就是控制台程序: 打开你的vs2015,按如下操作 二.第一个桌面程序 比如当我们删除一个东西会弹 ...
- IDEA安装maven和设置自动配置下载包
在我们开发的过程中如果环境配置好了,对于我们开发将优很大作用,减少可开发的时间,接下来我就讲解一下maven的安装和配置,以及在idea上配置,希望此教程同时对大家优帮助. 1.1.下载maven和安 ...
- Shell 脚本中 '$' 符号的多种用法
通常情况下,在工作中用的最多的有如下几项: $0:Shell 的命令本身 $1 到 $9:表示 Shell 的第几个参数 $? :显示最后命令的执行情况 $#:传递到脚本的参数个数 $$:脚本运行的当 ...
- LG1410 子序列 二分图判定
问题描述 LG1410 题解 如果\(i<j,a_j \le a_i\),那么他它们不能在一个上升序列中. 于是在\(i,j\)之间建边,看建出来的图是不是二分图即可. \(\mathrm{Co ...
- Gym101667 H. Rock Paper Scissors
将第二个字符串改成能赢对方时对方的字符并倒序后,字符串匹配就是卷积的过程. 那么就枚举字符做三次卷积即可. #include <bits/stdc++.h> struct Complex ...