Java NIO之六 分散读取、聚集写入 、字符集:charset

版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/89289890

分散(Scatter)和聚集(Gather)

  1. 分散读取(Scattering Reads)是指从Channel中读取的数据“分散”到多个Buffer中。
    在这里插入图片描述
    注:按照缓冲区的顺序,从Channel中读取的数据依次将Buffer填满。
  2. 聚集写入(Gathering Writes)是指将多个Buffer中的数据聚集到Channel。
    在这里插入图片描述
    注:按照缓冲区的顺序,写入position和limit之间的的数据到Channel。

demo

	/*五、分散(Scatter)与聚集(Gather)
	 *分散读取(Scattering Reads):将通道中的数据分散到多个缓冲区中
	 *聚集写入(Gathering writes):将多个缓冲区中的数据聚集到通道中
	 
	 *六、字符集:charset
	 *编码:字符串 -> 字节数组
	 *解码:字节数组 -> 字符串
	 */
	//分散和聚集
	@Test
	public void test4() throws Exception  {
		RandomAccessFile raf1 = new RandomAccessFile("1.txt", "rw");
		
		//1. 获取通道 
		FileChannel channel1 = raf1.getChannel();
		
		//2.分配指定大小的缓冲区
		ByteBuffer buf1 = ByteBuffer.allocate(100);
		ByteBuffer buf2 = ByteBuffer.allocate(1024);
		
		//3. 分散读取
		ByteBuffer [] bufs =  {buf1,buf2};
		channel1.read(bufs);
		
		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()));
	
		//4. 聚集写入
		RandomAccessFile raf2 = new RandomAccessFile("2.txt", "rw");
		FileChannel channel2 = raf1.getChannel();
		channel2.write(bufs);
		
		channel2.close();
		channel1.close();
	}


	//字符集
	@Test
	public void test6() throws Exception {
		Charset charset = Charset.forName("GBK");
		
		//获取编码器
		CharsetEncoder ce = charset.newEncoder();
		
		//获取解码器
		CharsetDecoder cd = charset.newDecoder();
		
		CharBuffer cb = CharBuffer.allocate(1024);
		cb.put("中国共和");
		cb.flip();
		
		//编码
		ByteBuffer bBuf = ce.encode(cb);
		
		for (int i = 0; i < 8; i++) {
			System.out.println(bBuf.get());
		}
		//解码
		bBuf.flip();
		CharBuffer cBuf = cd.decode(bBuf);
		System.out.println(cBuf.toString());
		
		System.out.println("-----------------");
		bBuf.flip();
		Charset charset2 = Charset.forName("UTF-8");
		CharBuffer cBuf2 = charset2.decode(bBuf);
		System.out.println(cBuf2.toString());
	}
	//获取可操作字符集并遍历
	@Test
	public void test5() {
		Map<String, Charset> map = Charset.availableCharsets();
		
		Set<Entry<String,Charset>> set = map.entrySet();
		
		for (Entry<String, Charset> entry : set) {
			System.out.println(entry.getKey() + "-->" + entry.getValue());
		}
	}

猜你喜欢

转载自blog.csdn.net/qq_34626097/article/details/89289890
今日推荐