package text2;

import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.ReadableByteChannel;

public class bing {


    public static void main(String[] args) throws IOException {
        
        	FileInputStream  inStream  = new FileInputStream("E:/11111/8ci.dat"); 
            FileOutputStream outStream = new FileOutputStream("E:/11111/8ci1.txt"); 
            //getChannel()该方法的返回类型为FileChannel,它返回与此流连接的FileChannel。
            ReadableByteChannel inCh = inStream.getChannel(); 
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outStream)); {
            //ByteBuffer提供了两种静态实例方式: 
            //public static ByteBuffer allocate(int capacity)  
            //public static ByteBuffer allocateDirect(int capacity)  
            //第一种分配方式产生的内存开销是在JVM中的,而另外一种的分配方式产生的开销在JVM之外,以就是系统级的内存分配。
            //当Java程序接收到外部传来的数据时,首先是被系统内存所获取,然后在由系统内存复制复制到JVM内存中供Java程序使用。
            //所以在另外一种分配方式中,能够省去复制这一步操作,效率上会有所提高。
            //可是系统级内存的分配比起JVM内存的分配要耗时得多,所以并非不论什么时候allocateDirect的操作效率都是最高的。
            ByteBuffer buffer = ByteBuffer.allocateDirect(32 * 1024);
            //ByteOrder类定义了决定从缓冲区中存储或检索多字节数值时使用哪一字节顺序的常量。
            buffer.order(ByteOrder.LITTLE_ENDIAN);
            
            while (inCh.read(buffer) >= 0) {
                if (buffer.position() < 3) {//buffer.position() 它指的是下一次读取或写入的位置。
                    Thread.yield();//线程让步,和其他线程一起共同有获得执行的可能
                    continue;
                }
                //buffer.put(randomNumber);用于写入数据
                buffer.flip();//将Buffer从写模式切换到读模式(必须调用这个方法)
           //     buffer.get()读取buffer里面的数据
                //buffer.remaining()返回剩余的可用长度,此长度为实际读取的数据长度,最大自然是底层数组的长度。
                //于是这样看来这个ByteBuffer更像是一个可标记的流。
                while (buffer.remaining() > 3) {
                	//buffer.getFloat()此方法不需要任何参数,并且根据需要返回浮点缓冲区。该缓冲区反映了对原始缓冲区所做的更改,反之亦然。
                    float number = buffer.getFloat();
                    writer.append(String.valueOf(number)).append(' ');
                }
                //调用clear()方法:position将被设回0,limit设置成capacity,换句话说,Buffer被清空了,其实Buffer中的数据并未被清除,
                //只是这些标记告诉我们可以从哪里开始往Buffer里写数据。
                //如果Buffer中有一些未读的数据,调用clear()方法,数据将“被遗忘”,意味着不再有任何标记会告诉你哪些数据被读过,哪些还没有。
                //如果Buffer中仍有未读的数据,且后续还需要这些数据,但是此时想要先写些数据,那么使用compact()方法。
                //compact()方法将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。
                //limit属性依然像clear()方法一样,设置成capacity。
                buffer.compact();
            }
            //FileWriter的flush()方法是从OutputStreamWriter中继承来的,其作用就是清空缓冲区并完成文件写入操作的。
            writer.flush();
        }
    }
}

buffer.getInt();
从字节流里读取4个字节,并根据当前的顺序将他们组合成一个int值。