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

文章目录

    • 分散(Scatter)和聚集(Gather)
    • demo

分散(Scatter)和聚集(Gather)

  1. 分散读取(Scattering Reads)是指从Channel中读取的数据“分散”到多个Buffer中。
    Java NIO之六 分散读取、聚集写入 、字符集:charset_第1张图片
    注:按照缓冲区的顺序,从Channel中读取的数据依次将Buffer填满。
  2. 聚集写入(Gathering Writes)是指将多个Buffer中的数据聚集到Channel。
    Java NIO之六 分散读取、聚集写入 、字符集:charset_第2张图片
    注:按照缓冲区的顺序,写入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());
		}
	}

你可能感兴趣的:(NIO,分散读取,聚集写入,NIO,字符集)