文件通道

简单的使用nio读取文件的例子

 1 public static void main(String[] args) throws Exception {
 2         FileInputStream fis = new FileInputStream("/home/tp/1.txt");
 3         FileChannel fc = fis.getChannel();//获取通道
 4         ByteBuffer bb = ByteBuffer.allocate(1024);//创建一个缓冲区
 5         fc.read(bb);把数据读到缓冲区
 6         bb.flip();//重设buffer,limit设置为position,position设置为0
 7         while(bb.hasRemaining()){//查看position和limit之间是否还有元素
 8             byte b = bb.get();//读取当前位置的整数
 9             System.out.print((char)b);
10         }
11         fis.close();
12     }

简单使用nio写文件的例子

 1 public static void main(String[] args) throws Exception {
 2         FileOutputStream fileOutputStream = new FileOutputStream("/home/tp/2.txt");//如果没有这个文件会自己创建
 3         byte message[] = { 83, 111, 109, 101, 32, 98, 121, 116, 101,115, 46 };
 4         FileChannel fileChannel = fileOutputStream.getChannel();//获取通道
 5         ByteBuffer buffer = ByteBuffer.allocate(1024);//创建一个缓冲区
 6         for (int i = 0; i < message.length; ++i) {
 7             buffer.put(message[i]);//写入到缓冲区中。
 8         }
 9         buffer.flip();//重设buffer,limit设置为position,position设置为0
10         fileChannel.write(buffer);//把缓存写到通道里。
11         fileOutputStream.close();
12     }

结果:

在文件中打印 some bytes.

FileChannel无法设置为非阻塞模式的,它总是运行在阻塞模式下的。

对于某个特定位置进行数据的读写操作,

可以先调用position方法获取fileChannel的当前位置

也可以通过position(long pos)方法设置FileChannel的当前位置

size()方法将返回该实例所关联文件的大小

force(boolean metaData)方法将通道里尚未写入磁盘的数据强制写到磁盘上,metaData为true将包含权限。

truncate(n)截取文件前40字节,对文件本身发生作用,需要有写权限。

FileChannel有两个独有的方法:transferFrom()和transferTo(),因此,Channel-to-Channel传输中通道之一必须是fileChannel。直接的传输通道不会更新与某个FileChannel关联的position值。直接的通道传输不会更新与某个FileChannel关联的

position值。对于传输数据来源是一个文件的transferTo方法,如果position+count大于文件的size值,传输会在文件末尾终止。

 1 public static void main(String[] args) throws Exception {
 2         RandomAccessFile fromFile = new RandomAccessFile("/home/tp/1.txt", "rw");
 3         FileChannel fromChannel = fromFile.getChannel();
 4         RandomAccessFile toFile = new RandomAccessFile("/home/tp/2.txt", "rw");
 5         FileChannel toChannel = toFile.getChannel();
 6         long position =0;
 7         long count = fromChannel.size();
 8         //toChannel.transferFrom(fromChannel, position, count);//可以与下面那行替换。
 9         fromChannel.transferTo(position, count, toChannel);//调用tranferTo方法把自己里面从position开始count字节的数据发到toChannel去。
10         toChannel.close();  
11         toFile.close();  
12         fromChannel.close();  
13         fromFile.close();  
14     }

FileChannelImpl的源码:  http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/nio/ch/FileChannelImpl.java#FileChannelImpl

原文地址:https://www.cnblogs.com/tp123/p/6433701.html