文章目录
一、分散和聚集
【1】分散读取
分散读取 (Scattering Reads)是指从 Channel 中读取的数据“分散”到多个 Buffer 中。
注意: 按照缓冲区的顺序,从 Channel 中读取的数据依次将 Buffer 填满。
【2】聚集写入
聚集写入(Gathering Writes)是指将多个 Buffer 中的数据“聚集” 到 Channel。
注意:按照缓冲区的顺序,写入position 和 limit之间的数据到 Channel 。
@Test
public void test4() throws IOException{
//1. 获取通道
RandomAccessFile raf1 = new RandomAccessFile("1.txt", "rw");
FileChannel channel1 = raf1.getChannel();
//2. 分配指定大小的缓冲区
ByteBuffer buf1 = ByteBuffer.allocate(100);
ByteBuffer buf2 = ByteBuffer.allocate(1024);
//3. 分散读取
ByteBuffer[] bufs = {buf1, buf2};
channel1.read(bufs); // 1
for(ByteBuffer byteBuffer : bufs) { byteBuffer.flip(); }
System.out.println(new String(bufs[0].array(), 0, bufs[0].limit()));
System.out.println("-----------------");
System.out.println(new String(bufs[1].array(), 0, bufs[1].limit()));
// 获取通道
RandomAccessFile raf2 = new RandomAccessFile("2.txt", "rw");
FileChannel channel2 = raf2.getChannel();
//4. 聚合写入 (管道是外部,缓冲区是内部)
channel2.write(bufs);
}
管道1由关联 1.txt 的文件流得来,故分散读取时,会先把大小为100的 buf1 填满,然后对 buf2 进行填充 (按顺序读取)。
管道2由关联 2.txt 的文件流得来,在聚合写入时,先把从 buf1 得到的数据写入到 bufs,然后写入 buf2 的数据 (按顺序写入)。
二、字符集 Charset
编码:字符串 —> 字节数组
解码:字节数组 —> 字符串
@Test
public void test6() throws IOException{
Charset cs1 = Charset.forName("GBK"); //设定字符集
CharsetEncoder ce = cs1.newEncoder(); //获取编码器
CharsetDecoder cd = cs1.newDecoder(); //获取解码器
CharBuffer cBuf = CharBuffer.allocate(1024);
cBuf.put("测试编码与解码!");
cBuf.flip();
//编码
ByteBuffer bBuf = ce.encode(cBuf);
for (int i = 0; i < 12; i++) { System.out.println(bBuf.get()); }
//解码
bBuf.flip();
CharBuffer cBuf2 = cd.decode(bBuf);
System.out.println(cBuf2.toString());
System.out.println("------------------------------------------------------");
Charset cs2 = Charset.forName("UTF-8");
bBuf.flip();
CharBuffer cBuf3 = cs2.decode(bBuf);
System.out.println(cBuf3.toString()); //乱码
}
注:编码器与解码器的字符集需要一致才可避免乱码!