FileChannel(API详解)

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_ONLYREAD_WRITEPRIVATE

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

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值