java NIO 之 buffer and channel(2)

调试一个写混合数据,且数据长度不等的程序:

其实文件的读入写出都是建立在bytebuffer上的,其它的什么longbuffer,charBuffer,doublebuffer等都是视图buffer,有点和数据库与视图的关系相似,但是不同的是视图buffer的改变要会引起bytebuffer的改变。

buf.position(8);
CharBuffer charBuf = buf.asCharBuffer();

这里buf.position(8);其实是指向了charbuffer的开始位置,也就是charbuffer这个视图buffer是从8个字节之后开始的。其实到这里都不是问题的重点,问题的重点在下面:
 buf.clear();
 doubleBuf.clear();
 charBuf.clear();

这里的清空操作不会将视图buffer的起始位置改变,也就是charbuffer从创建到销毁,它的开始位置都是从8个字节后开始。

所以说每次循环虽然都清空了,但是不会影响charbuffer的开始位置。

所以buf.position(8);这句话是不能删除或者移到循环里面的。 

下面贴出程序代码:

public class NumToFile2 {

public static void main(String[] args) {

long[] nums = new long[100];

for (int i = 0; i < 100; i++) {

nums[i] = (long) i;

}

File aFile = new File("num2.txt");

FileOutputStream outputFile = null;

 try {

   outputFile = new FileOutputStream(aFile);

  } catch (FileNotFoundException e) {

   e.printStackTrace();

  }

  FileChannel fileChannel = outputFile.getChannel();

  final int BUFFERSIZE = 100;

  ByteBuffer buf = ByteBuffer.allocate(BUFFERSIZE);

  DoubleBuffer doubleBuf = buf.asDoubleBuffer();

  buf.position(8);

  CharBuffer charBuf = buf.asCharBuffer();

  LongBuffer longBuf = null;

  String numStr = null;

  for (long num : nums) {

   numStr = "num = " + num;

   doubleBuf.put(0, (double) numStr.length());

   charBuf.put(numStr);

   buf.position(2 * charBuf.length() + 8);

   longBuf = buf.asLongBuffer();

   longBuf.put(num);

   buf.position(buf.position() + 8);

   buf.flip();

   try {

    fileChannel.write(buf);

   } catch (Exception e) {

    e.printStackTrace();

   }

   buf.clear();

   doubleBuf.clear();

   charBuf.clear();

  }

  try {

   System.out.println("File wirttern is " + fileChannel.size()+ "bytes");

   outputFile.close();

  } catch (IOException e) {

   e.printStackTrace();

  }

 }

}

你可能感兴趣的:(java,nio,buffer,FileChannel)