调试一个写混合数据,且数据长度不等的程序:
其实文件的读入写出都是建立在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();
}
}
}