博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FileChannel 专讲
阅读量:4039 次
发布时间:2019-05-24

本文共 1283 字,大约阅读时间需要 4 分钟。

1.一个java的FileChannel就是一个连接文件的通道。使用它可以从文件读取数据或者向文件写入数据。一个FileChannel固定的以块的模式进行读写。怎么获取一个文件通道的变量呢?你可以通过FileInputStream,FileOutputStream,RandomAccessFile来获取一个文件通道.例如:
     FileInputStream fis=new FileInputStream("test.txt");
     FileChannel fc=fis.getChannel();
2.如何使用一个文件通道来读取数据?
     ByteBuffer bf=ByteBuffer.allocate(1024);
     int bytesRead=fis.read(bf);
    这两行代码到底有什么含义呢?第一行表示创建了一个名字叫做bf的大小为1024byte的缓冲区。第二行表示文件通道fis读入bf缓冲区数据,返回实际读入缓冲区数据的长度。这个时候,会有一个问题,如果到了文件尾部会有什么情况?这个时候返回的数值是-1.我们可以通过这个来判断文件读入是否到达文件的结束。
3.如何向一个文件通道写入数据到文件?这里给出一段代码,可以通过分析它得到想要的方法:
    String data="hello world!hi!";
    ByteBuffer bf=ByteBuffer.allocate(8);
    bf.clear();//清除缓冲区,保证是空的
    bf.put(data.getBytes());
    bf.flip();
    while(bf.hasRemaining()){
      fis.write(bf);
   }
4.FileChannel和输入输出流一样是需要消耗内存的,所以使用完毕后要记得关闭。
   fis.close();
5.如果你想在FileChannel特定的位置上进行读写操作,可以同FileChannel的position()来获取它的当前位置,也可以用position(long pos)来指定将要开始的位置。
6.怎样获取FileChannel连接的文件的大小,这个可以使用FileChannel的size()方法来获取。
7.如果你想从文件当中截取一部分,注意仅仅只是一部分。这个可以考虑使用FileChannel的truncate()方法,参数为长度来截到想要的部分。
8.如果你尝试向文件中写入数据,运行完程序之后发现数据并没有写进去,这个该怎么解决它呢?可以思考一下带缓冲的流通常只有在关闭的时候才会把缓冲区最后一个数据包发送走,亦可以强制刷新缓冲区。FileChannel的刷新缓冲区的方式是调用自己的force(true)方法。

NIO vs IO
NIO是基于缓冲区进行操作的,可以在缓冲区内进行操作;IO是基于流上进行操作,会所动当前的线程,直到完成流的读写操作。NIO相比IO不会锁定线程,一个线程可以操控多个FileChannel,极大的提高了效率。所以,基于大量IO流操作的系统当中,可以使用NIO的FileChannel进行优化。

转载地址:http://ahpdi.baihongyu.com/

你可能感兴趣的文章
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt5 everywhere编译完成后,找不到qmake
查看>>
arm-linux开机读取硬件时钟,设置系统时钟。
查看>>
交叉编译在x86上调试好的qt程序
查看>>
qt 创建异形窗体
查看>>
可重入函数与不可重入函数
查看>>
简单Linux C线程池
查看>>
内存池
查看>>
输入设备节点自动生成
查看>>
GNU hello代码分析
查看>>
Qt继电器控制板代码
查看>>
wpa_supplicant控制脚本
查看>>
gstreamer相关工具集合
查看>>
arm 自动升级脚本
查看>>
RS232 四入四出模块控制代码
查看>>
gstreamer插件之 videotestsrc
查看>>
autoupdate script
查看>>