package com.wq.nio;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
/**
* 1.ASCII American Standard Code for Information Interchange,美国信息交换标准代码
* 7 bit来表示一个字符,共计可以表示128种字符
* 2.ISO-8859-1
* 8 bit来表示一个字符,即用一个字节byte 8bit来表示一个字符,共计可以表示256个字符,基于ASCII扩张完全适配
* 3.gb2312 中国国家标准制定
* 2 bit表示一个汉字 表示不了生僻字
* 4.gbk
* 能够表示生僻字
* 5.gb18030 最完整的的汉字表达形式
*
* 6.big5 台湾繁体中文
*
* 7.unicode 表示全世界所有国家的字符,最全字符编码形式 存储容量会巨大膨胀,不适用于存储对于英文国家
* 2字节表示一个字符
* 8.UTF unicode Translation Format
* unicode是一种编码方式,而UTF是一种存储方式,utf-8是UTF的实现方式之一,
*
* utf-16 2字节表示 还是浪费存储
* UTF-16LE little endian UTF-16BE big endian 大端 小端
* Zero Width No-Break Space,实际上不存在,用16进制0xFEFF 这种叫BE 0xFFFE 叫做LE
*
* utf-8 变长字节表示形式 兼容ASCII ISO-8859-1
* 一般utf-8用3个字节表示中文,最多用6个字节表示但是不常用
*
* BOM (Byte Order Mark) 字节序标记 windows会有bom头 如果解码不考虑会无法识别
*/
public class NioTest13 {
public static void main(String[] args) throws IOException {
String inputFile = "src/main/java/com/wq/nio/NioTest13_in.txt";
String outputFile = "src/main/java/com/wq/nio/NioTest13_out.txt";
RandomAccessFile input = new RandomAccessFile(inputFile,"r");
RandomAccessFile output = new RandomAccessFile(outputFile,"rw");
Long inputLength = new File(inputFile).length();
FileChannel inputChannel = input.getChannel();
FileChannel outputChannel = output.getChannel();
//内容是文件内存映射区域的直接字节缓冲区。
MappedByteBuffer inputData = inputChannel.map(FileChannel.MapMode.READ_ONLY,0,inputLength);
CharBuffer charBuffer = Charset.forName("iso-8859-1").decode(inputData);//解码
System.out.println(charBuffer.get(7));
ByteBuffer byteBuffer = Charset.forName("iso-8859-1").encode(charBuffer);//编码
outputChannel.write(byteBuffer);
input.close();
output.close();
System.out.println("=========输出系统所有可用的编码字符集===============");
Charset.availableCharsets().forEach((k,v)->{
//System.out.println(k+","+v);
});
System.out.println("=========输出系统所有可用的编码字符集===============");
//nihao
//你好
}
}