一,官方描写叙述


一个读,写,映射,操作文件的通道。

文件通道有能够被查询和改动的一个当前位置。文件本身包括了一个可悲读写的变长字节序列,而且它的当前的size会被查询。当被写入的字节超过当前文件的大

小时。文件的大小会添加;当文件被截断的时候,文件的大小会降低。文件有一个写被关联的像权限,内容类型和最后改动时间的元数据;这个类未定义訪问元数

据的方法。

此外对于熟悉的字节通道读写关闭操作,这个类定义了下面的特定文件操作:

1.在文件的绝对位置的字节读写操作在某种程度上不会影响通道的当前位置。

2.文件的区域可能会被直接映射到内存中,对于大文件来说。这比通常的读写方法更有效。

3.为了保证数据在系统崩溃之后不丢失数据。文件的改动模式会被强制究竟层存储设备。

4.字节能从一个文件被转换为一些其它的通道,反之亦然。这样的操作在某种程度上会被很多操作系统或者文件系统优化成一个很高速的直接传输。

5.文件的区域或许会被锁住来防止其他程序的訪问。

文件通道在多线程下是安全的,close方法能在不论什么时候被调用,这种方法在接口Channel中被指定。在不论什么时间。仅仅有涉及到通道的position

和改变它的文件的size的过程中的操作。当第一个这个方案在处理中时尝试初始化第二个这种操作将被堵塞,知道第一个操作完毕。

其他的操作,特别是显

式的获取position,会被同步处理;它们是否其实做了同步,这样以来于底层操作系统的实现,因此是未特别指定的。

文件的视图通过这个类的实例被提供。这个视图确保跟在同样程序中的被其他实例提供的同样文件视图的一致性。这个类的实例或许会或许不会提供视图,通过其他的

同步程序保持视图的可见性。应归于被执行的底层操作系统和网络文件系统延迟的引导的缓存。

无论语言在其他程序中写,这是事实。并且无论它们执行在同样的机

器上还是不同的机器上,不论什么这种不一致的确切性质是依赖于系统,因此,未特指。

这个类未定义打开文件或者创建一个新文件的方法;这些方法或许在未来的发行版中被加入。

像这种文件通道能够通过

FileInputStream,FileOutputStream,RandomAccessFile类中的getChannel方法获得。这个

getChannel返回的文件通道是被连接到同样的底层文件的。

文件通道的状态与通过getChannel方法返回的channel对象是紧密相连的,假设明白的改变文件通道的position或者读写字节,则会改变原

始对象的文件position,反之亦然。通过文件通道改变文件通道的长度将改变原始对象的文件长度,反之亦然。改变文件通道的内容也会改变原始对象的文

件内容,反之亦然。

这个类指定了个别的指针。像“仅仅读打开”,“仅仅写打开”。“读写打开”。通过FileInputStream的getChannel方法获取的文件通道是仅仅

读的。当然通过FileOutputStream的getChannel的方法获取的文件通道是可写的。通过RandomAccessFile的

getChannel的方法获取的文件通道。在创建时假设传递的參数是“r",则为仅仅读,否则为”读写“或者“写”。

文件通道或许在追加模式下被打开,

比如它的获得是通过一个给FileOutputStream(boolean)或者FileOutputStream(FIle,boolean)传递參

数true时,则这个通道是在追加模式下。在这样的模式下。每一个相对写方法的调用操作首先会把position增长到文件尾部。然后写入被请求的数据。

是否

文件position的增长和数据的写入在原子操作下被完毕是依赖于操作系统的。并为特指。

二,源代码分析


FileChannel这个类是继承于抽象类AbstractInterruptibleChannel,实现了接口ByteChannel,GatheringByteChannel,ScatteringByteChannel。

因为这个类的实现类FileChannelImpl没有被提供源代码。因此。在JDK中是看不到的,想看源代码,猛击这里FileChannelImpl

至于源代码分析,博主看了几个小时也没看出个门道来,太复杂。并且又接近底层,博主如今还没能力分析源代码,所以就不分析了。有志向一探到底的,大家能够自己去看看啊。

三,实例


package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; public class FileChannelTest {
    private static final String outputPath = "output.txt";
    private static String data = "你好,我是张三
我今天非常开心和你约会
请多多不吝赐教";
    public static void main(String[] args) throws IOException {
        File inputFile = new File(outputPath);
        File outputFile = new File(outputPath);
        if(!inputFile.exists()) {
            inputFile.createNewFile();
        }
        if(!outputFile.exists()) {
            outputFile.createNewFile();
        }
        //实例化输入输出流,而且获取相相应的FileChannel实例
        FileInputStream fis = new FileInputStream(inputFile);
        FileChannel inputChannel = fis.getChannel();
        FileOutputStream fos = new FileOutputStream(outputFile);
        FileChannel outputChannel = fos.getChannel();
        //获取数据的字节数组
        byte[] outputBuffer = data.getBytes();
        //分配一个字节缓冲(这个类在下一篇中介绍)
        ByteBuffer obb = ByteBuffer.allocate(1024);
        //将字节数组读入字节缓冲中
        obb.put(outputBuffer);
        obb.flip();  //调用该方法表示開始读取字节缓冲中的数据。即limit=position,position=0
        //将字节写入文件里
        int n = outputChannel.write(obb);
        outputChannel.close();  //关闭通道
        System.out.println("output n is " + n);
        fos.close();  //关闭输出流
        //再分配一个字节缓冲
        ByteBuffer ibb = ByteBuffer.allocate(1024);
        //将数据从通道中读入字节缓冲中
        int in = inputChannel.read(ibb);
        //初始化一个字节数组。这个字节数组的长度不能大于这个字节缓冲的limit-position的长度,不然会抛出java.nio.BufferUnderflowException
        byte[] inputBuffer = new byte[ibb.position()];
        //准备从字节缓冲中读取数据
        ibb.flip();
        System.out.println("input n is " + in);
        //将数据读入字节数组中
        ibb.get(inputBuffer);
        System.out.println(new String(inputBuffer));
        inputChannel.close();
        fis.close();
    } }

FileChannel的深入理解的更多相关文章

  1. FileChannel类的理解和使用

    FileChannel类的理解和使用(java.nio.channels.FileChannel) 知识点: 1.FileChannel类及方法理解:2.普通输入输出流复制文件:3.FileChann ...

  2. NIO之FileChannel类的理解和使用

    文章链接:http://blog.csdn.net/qq_16628781/article/details/70532307 知识点: FileChannel类及方法理解: 普通输入输出流复制文件: ...

  3. JAVA IO 以及 NIO 理解

    由于Netty,了解了一些异步IO的知识,JAVA里面NIO就是原来的IO的一个补充,本文主要记录下在JAVA中IO的底层实现原理,以及对Zerocopy技术介绍. IO,其实意味着:数据不停地搬入搬 ...

  4. Flume FileChannel优化(扩展)实践指南

    本文系微博运维数据平台(DIP)在Flume方面的优化扩展经验总结,在使用Flume FileChannel的场景下将吞吐率由10M/s~20M/s提升至80M/s~90M/s,分为四个部分进行介绍: ...

  5. Java I/O之NIO概念理解

    JDK1.4的java.nio.*包引入了新的Java I/O新类库,其目的在于提高速度.实际上,旧的I/O包已经使用nio重新实现过,以便充分利用这种速度提高,因此即使我们不显式地用nio编码,也能 ...

  6. 《深入理解JAVA虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...

  7. 一文让你彻底理解 Java NIO 核心组件

    背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相对于同 ...

  8. 深入理解JAVA中的NIO

    前言: 传统的 IO 流还是有很多缺陷的,尤其它的阻塞性加上磁盘读写本来就慢,会导致 CPU 使用效率大大降低. 所以,jdk 1.4 发布了 NIO 包,NIO 的文件读写设计颠覆了传统 IO 的设 ...

  9. 彻底理解Netty,这一篇文章就够了

    Netty到底是什么 从HTTP说起 有了Netty,你可以实现自己的HTTP服务器,FTP服务器,UDP服务器,RPC服务器,WebSocket服务器,Redis的Proxy服务器,MySQL的Pr ...

随机推荐

  1. 一:1.1 python程序与数据储存【进制转换】

    二进制 :0 1 [逢二进一]0+0=00+1=11+1=1011+1=100 1 1+ 1------ 100 八进制: 0 1 2 3 4 5 6 7 [逢八进一] 1+7=101+2=3 十进制 ...

  2. Python安装selenium启动浏览器

    1:在Python运行火狐或谷歌的浏览器是需要下载相对应的驱动 例如:你想在Python中使用代码命令打开firefox的网页 如果没有安装驱动,直接运行的话会出下面的错误 所以我们要安装相对应的浏览 ...

  3. 【BZOJ 1047】[HAOI2007]理想的正方形

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二维的ST表. 每个大的正方形可以由4个小的正方形组成. 然后区域内的最大值最小值.也可以由4个小的张方形部分全部覆盖到. [代码] ...

  4. 基于请求响应的MVC框架调用分析

    一.使用Servlet来处理请求响应 当client提交数据之后.接着发送请求,请求被封装成对象,server接收到请求,依据请求的URL.来推断将请求对象交由哪个Servlet处理. 在servle ...

  5. 多校第十场1009 CRB and String题解

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5414 题意:给你两个字符串s和t,你能够在字符串s中随意选一个字符c,在该字符c后插入一个字符d(d! ...

  6. 杭电1425 sort

    Problem Description 给你n个整数.请按从大到小的顺序输出当中前m大的数.   Input 每组測试数据有两行,第一行有两个数n,m(0<n,m<1000000).第二行 ...

  7. 流水线技术原理和Verilog HDL实现

    所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时 ...

  8. .Net经典笔试题

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答:private:私有成员,在类的内部才可以访问: protected:保护成员,该类内部和 ...

  9. springboot 使用mybatis 通用Mapper,pagehelper

    首先需要maven导入需要的包,这里用的是sqlserver,druid,jtds连接数据库 <dependency> <groupId>com.alibaba</gro ...

  10. 把华为交换机设置成时钟源服务器(NTP)

    把华为交换机设置成时钟源服务器(NTP),提供给下面客户端Linux服务器使用, 1,先设置交换机的时区,和正确时间 # 假设地理位置在中国北京,设置本地时区名称为BJ. 如果系统默认的UTC是伦敦时 ...