【1.3】分散读取、聚集写入、字符集

文章目录


一、分散和聚集

【1】分散读取

分散读取 (Scattering Reads)是指从 Channel 中读取的数据“分散”到多个 Buffer 中。
【1.3】分散读取、聚集写入、字符集
注意: 按照缓冲区的顺序,从 Channel 中读取的数据依次将 Buffer 填满。


【2】聚集写入

聚集写入(Gathering Writes)是指将多个 Buffer 中的数据“聚集” 到 Channel。
【1.3】分散读取、聚集写入、字符集
注意:按照缓冲区的顺序,写入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());	//乱码
}

:编码器与解码器的字符集需要一致才可避免乱码!


三、

Last Article

【1.2】缓冲区和通道

Next Article

上一篇:java – 为什么DirectByteBuffer.array()有额外的大小?


下一篇:java NIO 深入学习