FileChannel 专讲

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进行优化。

你可能感兴趣的:(java)